gpt4 book ai didi

python - 使用 Uber 的 vertica-python 包使用 Python 批量插入到 Vertica

转载 作者:太空宇宙 更新时间:2023-11-03 16:09:25 26 4
gpt4 key购买 nike

问题 1(共 2 个问题)

我正在尝试使用 Python 和 Uber 的 vertica-python 包将数据从 CSV 文件导入到 Vertica。问题在于纯空白数据元素被作为 NULL 加载到 Vertica 中;我只想将空数据元素作为 NULL 加载,并将非空空白数据元素作为空白加载。

例如,CSV 文件的以下两行都作为 ('1','abc',NULL,NULL) 加载到数据库中,而我希望将第二行加载为 ('1', 'abc'、' '、NULL)。

1,abc,,^M
1,abc, ,^M

这是代码:

# import vertica-python package by Uber
# source: https://github.com/uber/vertica-python
import vertica_python

# write CSV file
filename = 'temp.csv'
data = <list of lists, e.g. [[1,'abc',None,'def'],[2,'b','c','d']]>
with open(filename, 'w', newline='', encoding='utf-8') as f:
writer = csv.writer(f, escapechar='\\', doublequote=False)
writer.writerows(data)

# define query
q = "copy <table_name> (<column_names>) from stdin "\
"delimiter ',' "\
"enclosed by '\"' "\
"record terminator E'\\r' "

# copy data
conn = vertica_python.connect( host=<host>,
port=<port>,
user=<user>,
password=<password>,
database=<database>,
charset='utf8' )
cur = conn.cursor()
with open(filename, 'rb') as f:
cur.copy(q, f)
conn.close()

问题 2(共 2 个问题)

使用这种将数据加载到 Vertica 的方法时是否还需要注意任何其他问题(例如字符编码)?代码中还有其他错误吗?我并不是 100% 相信它可以在所有平台上运行(例如,当前在 Linux 上运行;在其他平台上可能存在记录终止符问题)。任何使此代码更加健壮的建议将不胜感激。

此外,是否有其他方法可以从 Python 向 Vertica 批量插入数据,例如直接从 Python 加载对象,而不必先将它们写入 CSV 文件,而不会牺牲速度?数据量很大,插入作业需要几个小时才能运行。

预先感谢您提供的任何帮助!

最佳答案

您拥有的复制语句应该按照您想要的方式处理空格。我使用非常相似的COPY对其进行了测试。

编辑:我错过了您对副本的真正要求,我将保留这部分,因为它可能对某些人仍然有用:

要修复空格,您可以更改复制语句:

copy <table_name> (FIELD1, FIELD2, MYFIELD3 AS FILLER VARCHAR(50), FIELD4, FIELD3 AS NVL(MYFIELD3,'') ) from stdin

通过使用填充符,它会将其解析为类似变量的内容,然后您可以稍后在副本中使用 AS 将其分配给实际的表字段。

至于任何问题...我经常在 Solaris 上做你所做的事情。我注意到的唯一一件事是你正在设置记录终止符,不确定这是否真的是你需要根据环境做的事情。我从来没有需要在linux、windows 和solaris 之间切换。

此外,还有一个提示,这将返回一个结果集,该结果集将告诉您加载了多少行。执行 fetchone() 并将其打印出来,您就会看到它。

我唯一可以推荐的另一件事可能是使用拒绝表,以防任何行拒绝。

您提到这是一项艰巨的工作。您可能需要通过将 'read_timeout': 7200, 添加到您的连接或更多来增加读取超时。我不确定 None 是否会禁用读取超时。

至于更快的方法...如果文件可以直接在 vertica 节点本身上访问,您可以直接在副本中引用该文件,而不是从 stdin 进行复制并获得守护进程直接加载它。它速度更快,并且有许多您可以进行的优化。然后,您可以使用分配的加载,如果您有多个文件要加载,您可以在文件列表中将它们全部引用。

不过,这是一个很长的话题。如果您有任何具体问题,请告诉我。

关于python - 使用 Uber 的 vertica-python 包使用 Python 批量插入到 Vertica,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39418808/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com