记一次大量数据导入导出SAP系统实验
最近因为碰到一个大量数据传输到 SAP 的场景,在个人的 ECC 虚拟机上做了一个数据导入到 SAP 并且从 SAP 导出的测试,本文是对测试过程要点的记录。
导入
测试场景:将 具有 4 列 500 万条数据导入到 zemployee 表,zemployee 表的结构:
通过 Python 第三方模块 faker 生成模拟数据,4 列数据以 csv 格式存储,文件体积为 350 M。
from faker import Faker
import randomfake = Faker(locale="zh_CN")
MAX_ROW = 5000000def generate_random_info(): emp = {"name": fake.name(),"address":fake.address(),"phone":fake.phone_number()}return empif __name__ == "__main__":with open("fakeemployees.csv", mode="a", encoding="utf8") as f:for idx in range(0, MAX_ROW):info = generate_random_info()line = ",".join([str(idx+1), info.get("name"), info.get("address"), info.get("phone")])f.write(line+'\n')
一次性将所有这些数据导入到 SAP 是不合理的,所以我用分批的方式将这些数据导入,但也不是逐笔导入。在 SAP 中用 function module 实现数据的导入,一次传输导入的数据给 table 类型的参数,
创建一个 zemployee_insert 函数,employees 表参数为 importing 参数, ret 为返回值。
函数的代码如下:
zemployee_insert 允许远程调用,用 Python 的 PyRfc 模块来调用这个函数,不需要对文件进行分割,通过 Python 的 yield 关键字,实现数据分批。因为 yield 能在函数的调用者和函数之间反复交接控制权,减少内存的压力。每次以 1000 条为单位将数据传给 SAP zemployee_insert 函数。
from SAP.sap_systems import current_sap_connectionupload_file = "fakeemployees.csv"
batch_count = 1000def get_data_from_file(batch_max):employees = []with open(upload_file, mode="r",encoding="utf8") as f:batch = 0for line in f:(id, name, addr, phone) = line.split(sep=",")employees.append({"MANDT": "001","EMPID": id,"EMPNAME": name,"EMPADDR": addr,"PHONE": phone})batch += 1if batch == batch_max:yield employeesemployees =[]batch = 0if len(employees) > 0:yield employeesdef insert_employee():sap_conn = current_sap_connection()for employees in get_data_from_file(batch_count): rv = sap_conn.call("ZEMPLOYEE_INSERT", EMPLOYEES=employees)print(rv["RET"])if __name__ == "__main__":insert_employee()
我的 ECC 虚拟机运行在个人笔记本上,运行 python 代码的过程中,内存占用不大,还可以一边愉快地做其它事情。
导出
如果想全部将这 500 万条数据导出到本地文件,我试过包括后台运行在内的几种方法,都失败了。所以我最后决定用 ABAP 代码实现分批式将数据导出到 application server,文件从服务器到本地就不是难事。sql 语句的 package size 关键字实现了数据的分批处理。
源码
github - bulk data upload and download
参考
- How to download file from application server
- SAP导出大数据表
记一次大量数据导入导出SAP系统实验相关推荐
- 蓝的成长记——追逐DBA(3):古董上操作,数据导入导出成了问题
蓝的成长记--追逐DBA(3):古董上操作,数据导入导出成了问题 ***************************************声明************************** ...
- SQL SERVER 与ACCESS、EXCEL的数据导入导出转换
* 说明:复制表(只复制结构,源表名:a 新表名:b) select * into b from a where 1<>1 * 说明:拷贝表(拷贝数据,源表名:a 目标表名:b ...
- [导入][转]精妙的SQL和SQL SERVER 与ACCESS、EXCEL的数据导入导出转换
* 说明:复制表(只复制结构,源表名:a 新表名:b) select * into b from a where 1<>1 * 说明:拷贝表(拷贝数据,源表名:a 目标表名:b ...
- hive数据导入导出
Hive数据导入导出的几种方式 一,Hive数据导入的几种方式 首先列出讲述下面几种导入方式的数据和hive表. 导入: 本地文件导入到Hive表: Hive表导入到Hive表; HDFS文件导入到H ...
- [转载]在SQL Server数据库之间进行数据导入导出,OPENDATASOURCE
需要在c盘下先建立一个data.txt文件,然后在文件的第一行写上你要导出的列,不如说要导出id和name这两列,就在第一行写上 id,name 然后保存,使用下列SQL就可以了,你如果要保持原有的I ...
- (转)资料收集,新手必备的sql数据导入导出知识
转载自csdn SQL SERVER 与ACCESS.EXCEL的数据转换 熟悉SQL SERVER 2000的数据库管理员都知道,其DTS可以进行数据的导入导出,其实,我们也可以使用Transact ...
- DB2数据导入导出的小结
Db2的数据迁移,最常用的就是导入导出功能,而导入导出的命令貌似简单,实则内含玄机千变万化,这儿就工作中常用到的命令,小结了一下. 一.数据导入导出基础的格式知识 DEL:界定的ASCII文件,行分隔 ...
- oracle数据库数据导入导出步骤(入门)
oracle数据库数据导入导出步骤(入门) 说明: 1.数据库数据导入导出方法有多种,可以通过exp/imp命令导入导出,也可以用第三方工具导出,如:PLSQL 2.如果熟悉命令,建议用exp/i ...
- 使用Transact-SQL进行数据导入导出方法详解
本文为原创,如需转载,请注明作者和出处,谢谢! 本文曾发表于IT168:http://tech.it168.com/db/s/2006-08-16/200608160913336_1.shtml ...
- Oracle数据导入导出imp/exp
功能:Oracle数据导入导出imp/exp就相当与oracle数据还原与备份. 大多情况都可以用Oracle数据导入导出完成数据的备份和还原(不会造成数据的丢失). Oracle有个好处,虽然 ...
最新文章
- 麻省理工学院的新系统TextFooler, 可以欺骗Google的自然语言处理系统及Google Home的音频...
- 【转自知乎】:localhost、127.0.0.1 和 本机IP 三者的区别?
- 集成算法中的Bagging
- 如何在Kubernetes里给PostgreSQL创建secret
- 为什么PostgreSQL比MongoDB还快之完结篇(深挖单点索引查询)
- 天池在线编程 2020国庆八天乐 - 7 进制
- TF-IDF的java实现(权重排序,可用来处理大数据集)
- Nginx 默认的日志类型
- 读书笔记∣元数据:用数据的数据管理你的世界 Ch.5-8
- 气象报告是什么计算机领域,计算机辅助翻译系统在亚运气象服务方面的应用报告...
- 00001__伊丽莎白福尔摩斯
- 3Ds Max 精简材质编辑器 一片黑问题
- App刷量刷友盟方案
- html雨滴状的图案代码,HTML_HTML5实现晶莹剔透的雨滴特效,复制代码代码如下: html - phpStudy...
- 线性代数_4、行列式按行展开,异乘变零,拉普拉斯定理
- Nginx 的配置和访问控制的理论实验操作详情
- 第十章分治算法(大数相乘)
- ubuntu一键卸载php
- VBA-基本的文件操作语句与文件加密(加密dog)
- 微信小程序项目源码ssm校园跑腿+后台管理系统|前后分离VUE含论文+PPT+源码