首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Python使用Uber的vertica-python包批量插入Vertica

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

Stack Overflow用户
提问于 2016-09-09 19:49:15
回答 1查看 1.7K关注 0票数 2

2中的问题1

我试图使用Python将数据从CSV文件导入Vertica,使用Uber的vertica-python包。问题是,只有空格的数据元素正以NULL的形式加载到Vertica中;我只希望将空数据元素作为NULL加载,而非空的空白数据元素作为空白加载。

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

代码语言:javascript
复制
1,abc,,^M
1,abc,  ,^M

以下是代码:

代码语言:javascript
复制
# 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作业需要几个小时。

谢谢您能提供的任何帮助!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-09 19:59:05

对于空格,您拥有的copy语句应该以您想要的方式执行。我使用一个非常类似的COPY来测试它。

编辑:我错过了你对这份文件的真正要求,我会把这个部分留在里面,因为它可能对某些人仍然有用:

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

代码语言:javascript
复制
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,并让守护进程直接加载它。它的速度要快得多,并且有许多您可以做的优化。然后可以使用分配加载,如果要加载多个文件,则只需将它们一起引用到文件列表中即可。

不过,这是个很长的话题。如果你有什么特别的问题告诉我。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39418808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档