2中的问题1
我试图使用Python将数据从CSV文件导入Vertica,使用Uber的vertica-python包。问题是,只有空格的数据元素正以NULL的形式加载到Vertica中;我只希望将空数据元素作为NULL加载,而非空的空白数据元素作为空白加载。
例如,CSV文件的以下两行都以“1”、“abc”、“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的方法时,是否还需要注意其他问题(例如字符编码)?代码中还有其他错误吗?我并不是百分之百相信它能在所有的平台上工作(目前运行在Linux上;例如,在其他平台上可能会出现记录终止程序问题)。任何使此代码更加健壮的建议都将不胜感激。
此外,是否有其他方法可以从Python批量将数据插入Vertica,例如直接从Python加载对象,而不必首先将数据写入CSV文件,而不牺牲速度?数据量很大,执行insert作业需要几个小时。
谢谢您能提供的任何帮助!
发布于 2016-09-09 19:59:05
对于空格,您拥有的copy语句应该以您想要的方式执行。我使用一个非常类似的COPY来测试它。
编辑:我错过了你对这份文件的真正要求,我会把这个部分留在里面,因为它可能对某些人仍然有用:
要修复空格,可以更改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,或更多内容来增加读取超时。我不确定是否没有人会禁用读超时。
至于更快的方法..。如果可以在vertica节点本身直接访问该文件,您可以直接在副本中引用该文件,而不是执行copy from stdin,并让守护进程直接加载它。它的速度要快得多,并且有许多您可以做的优化。然后可以使用分配加载,如果要加载多个文件,则只需将它们一起引用到文件列表中即可。
不过,这是个很长的话题。如果你有什么特别的问题告诉我。
https://stackoverflow.com/questions/39418808
复制相似问题