使用python将数据插入redshift

Posted

技术标签:

【中文标题】使用python将数据插入redshift【英文标题】:Inserting data to redshift using python 【发布时间】:2018-03-30 09:33:01 【问题描述】:

我正在尝试在 amazon redshift 数据库中插入多行,这些行包含在元组列表中,如下所示:

my_rows=[(1, 0.0, 0, 0.0, 2010188534, 1816780086, 1113834, '2018-03-07 09:40:17', '2018-03-07 09:40:17', '2018-03-07 09:40:17'), (1, 0.0, 1, 0.0, 2010188536, 1816780086, 1119396, '2018-03-07 09:40:17', '2018-03-07 09:40:17', '2018-03-07 09:40:17'), (1, 0.0, 2, 0.0, 2010188538, 1816780086, 1119398, '2018-03-07 09:40:17', '2018-03-07 09:40:17', '2018-03-07 09:40:17'), (1, 0.0, 3, 0.0, 2010188540, 1816780086, 1123612, '2018-03-07 09:40:17', '2018-03-07 09:40:17', '2018-03-07 09:40:17'), (1, 0.5, 0, 0.0, 2010188542, 1816780102, 1086852, '2018-03-07 09:40:17', '2018-03-07 09:40:17', '2018-03-07 09:40:17'), (1, 0.5, 1, 0.0, 2010188544, 1816780102, 1087014, '2018-03-07 09:40:17', '2018-03-07 09:40:17', '2018-03-07 09:40:17'), (1, 0.3, 2, 0.0, 2010188546, 1816780102, 1089224, '2018-03-07 09:40:17', '2018-03-07 09:40:17', '2018-03-07 09:40:17'), (1, 0.3, 3, 0.0, 2010188548, 1816780102, 1089348, '2018-03-07 09:40:17', '2018-03-07 09:40:17', '2018-03-07 09:40:17'), (1, 0.3, 4, 0.0, 2010188550, 1816780102, 1122564, '2018-03-07 09:40:17', '2018-03-07 09:40:17', '2018-03-07 09:40:17')]

某些列可能包含None

我以这种方式将它们逐行插入Redshift 数据库:

    cur = con.cursor()
    columns_names=("c1","c2","c3","c4","c5","c6","c7","c8","c9","c10")
    insert_reference=len(my_rows[0])*"%s,"
    values_references="("+insert_reference[0:-1]+")"
    for row in my_rows:
      cur = con.cursor()
      insert_query="INSERT INTO "+table+" "+columns_names+" VALUES "+values_references+";"
      cur.execute(insert_query, row)

问题是,当我运行此代码时,它会阻塞在第一行,而不会引发任何错误。所以,我的问题是: 插入一行需要这么多时间是否正常?如果不是,我的代码中是否有一些错误?有什么有效的方法吗?

我能得到一些帮助吗? 提前谢谢你

【问题讨论】:

这个方法会非常非常慢 - 你希望插入多少行?多久一次? 我要插入大约 3000 行 一次性 - 或多久一次? 其实我现在只是在做一个测试,看看数据是否适合数据库,但是稍后,我会每 15 分钟摄取一次数据 避免使用 INSERT 命令将单行插入 Redshift。您应该使用 COPY 命令。见:Amazon Redshift Best Practices for Loading Data 【参考方案1】:

你应该遵循的过程:

    将数据以 csv 格式写入 s3 文件夹,最好是 gzip 格式 运行 redshift 复制命令将该数据导入临时 红移表格 运行 redshift sql 将该数据插入到您的表中

这将运行得很快,是正确且推荐的方式,并且可以扩展。

【讨论】:

首先,非常感谢您的回答。我有 JSON 格式的 aws s3 数据,我是否必须使用 Lambda 函数将过去和未来文件转换为 csv 格式? Amazon Redshift COPY 命令也可以COPY from JSON Format。 plus - 如果您想要其他选项 - 您可以在 redshift (spectrum) 中定义一个外部表来访问该 json 数据。 其实有点复杂,我的 JSON 结构是这样的:table: "x", action: "insert", row:c1:1, c2:"a"table: "x", action: "delete", row:c1:1, c2:"a" 所以需要在将文件复制到数据库之前对其进行处理,此外我需要自动复制数据实时,据我所知复制命令没有 你也可以考虑 aws kinesis

以上是关于使用python将数据插入redshift的主要内容,如果未能解决你的问题,请参考以下文章

使用python将数据插入mysql表

使用python将数据插入redshift

尝试使用python将数据插入sql数据库

使用python将数据插入mySQL

使用 Python 将嵌套列表插入 mysql 数据库

使用带有外部变量的python将数据插入mysql