我正在编写一个python脚本来将数据写入Vertica DB。我使用官方库vertica_db_client。出于某种原因,如果由于某种原因我使用内置的cur.executemany方法需要很长时间才能完成(每1k条目超过40秒)。我得到的建议是先将数据保存到文件中,然后使用“COPY”方法。这是save-to-a-csv文件部分:
with open('/data/dscp.csv', 'w') as out:
csv_out=csv.writer(out)
csv_out.writerow(("time_stamp", "subscriber", "ip_address", "remote_address", "signature_service_name", "dscp_out", "bytes_in", "bytes_out")) # which is for adding a title line
for row in data:
csv_out.writerow(row)
我的数据是元组列表。例子如下:
[\
('2019-02-13 10:00:00', '09d5e206-daba-11e7-b122-00c03aaf89d2', '10.128.67.132', '10.135.3.11', 'SIP', 26, 2911, 4452), \
('2019-02-13 10:00:00', '09d5e206-daba-11e7-b122-00c03aaf89d2', '10.128.67.132', '10.135.3.21', 'SIP', 26, 4270, 5212), \
('2019-02-13 10:00:00', '09d5e206-daba-11e7-b122-00c03aaf89d2', '10.128.67.129', '18.215.140.51', 'HTTP2 over TLS', 0, 14378, 5291)\
]
然后,为了使用COPY方法,我必须(至少基于他们的指令https://www.vertica.com/docs/9.1.x/HTML/python_client/loadingdata_copystdin.html),首先读取文件然后执行“从STDIN复制”。这是我的代码
f = open("/data/dscp.csv", "r")
cur.stdin = f
cur.execute("""COPY pason.dscp FROM STDIN DELIMITER ','""")
以下是连接数据库的代码,以防与问题相关
import vertica_db_client
user = 'dbadmin'
pwd = 'xxx'
database = 'xxx'
host = 'xxx'
db = vertica_db_client.connect(database=database, user=user, password=pwd, host=host)
cur = db.cursor()
很明显,首先保存然后阅读是浪费精力......巩固两个阅读部分的最佳方法是什么?
如果有人能告诉我为什么我的execute.many很慢,那将同样有用!
谢谢!
首先,是的,这是首先将数据写入文件的推荐方法和最有效的方法。一开始看起来效率可能不高,但是将数据写入磁盘上的文件几乎没有时间,但Vertica并未针对许多单独的INSERT
语句进行优化。批量加载是将大量数据导入Vertica的最快方法。不仅如此,但是当您执行许多单独的INSERT
语句时,您可能会遇到ROS回退问题,即使您不这样做,在加载后合并ROS容器时,数据库上也会有额外的负载。
您可以将元组数组转换为两个大字符串变量,然后将字符串打印到控制台。
该字符串看起来像:
'2019-02-13 10:00:00', '09d5e206-daba-11e7-b122-00c03aaf89d2', '10.128.67.132', '10.135.3.11', 'SIP', 26, 2911, 4452
'2019-02-13 10:00:00', '09d5e206-daba-11e7-b122-00c03aaf89d2', '10.128.67.132', '10.135.3.21', 'SIP', 26, 4270, 5212
'2019-02-13 10:00:00', '09d5e206-daba-11e7-b122-00c03aaf89d2', '10.128.67.129', '18.215.140.51', 'HTTP2 over TLS', 0, 14378, 5291
但是,不是将其实际打印到控制台,而是可以将其传输到VSQL命令中。
$ python my_script.py | vsql -U dbadmin -d xxx -h xxx -c "COPY pason.dscp FROM STDIN DELIMITER ','"
但这可能效率不高。我对python中非常长的字符串变量没有多少经验。
其次,Vertica不再积极开发vertica_db_client
。虽然它至少会在python2生命结束之前得到支持,但你应该使用vertica_python
。
你可以用pip安装vertica_python
。
$ pip install vertica_python
要么
$ pip3 install vertica_python
取决于您要使用的Python版本。
您也可以在Vertica的GitHub页面https://github.com/vertica/vertica-python/上找到源代码
至于在COPY
中使用vertica_python
命令,请在此处查看此问题的答案:Import Data to SQL using Python
我已经使用了几个python库连接到Vertica,vertica_python
是我最喜欢的,自从Vertica从Uber接管开发以来,它一直在不断改进。