如何在 python 中从 redshift 更快地处理数据?

Posted

技术标签:

【中文标题】如何在 python 中从 redshift 更快地处理数据?【英文标题】:How to process data faster in python from redshift? 【发布时间】:2017-12-29 06:41:11 【问题描述】:

我是 python 新手.. 我在 redshift 中有我的数据,我想在 python 中更快地处理数据。 我使用 python 是因为我想运行各种算法并对这些数据进行各种计算,而这在 redshift 中是不可能的。 我看到了教程,但每次加载 python 都花费了太多时间。 这是我的代码:

import psycopg2

con=psycopg2.connect(dbname = "xxxx", host="redshifttest-icp.cooqucvshoum.us-west-2.redshift.amazonaws.com", port= "5439", user="xxxx", password= "xxxx")
cur = con.cursor()

a = "select * from xxxx ;"

import pandas as pd
df = pd.read_sql(a,con)
df = df.fillna(0)
df2=df2.fillna(0)

这工作得很好,但我想要一些可以帮助我更快地处理数据的方法.. 谁能帮帮我?

【问题讨论】:

你打算在这里做什么?如果您的数据源中的数据太大,您可以使用块来加载它,而不是传输整个数据。 我只是想知道各种加载数据的方法,但是从redshift,我的数据在redshift amazon Redshift 在单个服务器上比 Python 快得多。建议将您的逻辑转换为 SQL 并在 Redshift 中运行。 “更快地处理数据”是什么意思?你想做什么?为什么要使用 pandas?如果您提供更多信息,您将获得更好的答案。随时编辑您的问题以提供更多详细信息。 @JohnRotenstein,我已经编辑了我的问题 【参考方案1】:

如果您从 Redshift 中检索大量行(超过约 1 万行),最快的方法是使用 UNLOAD command 将它们作为 CSV 直接提取到 S3。然后,您可以检索提取并在 Python 中对其进行操作。

如果您正在处理更大的数字(数百万),那么我怀疑您将受到 Python 速度的限制。在这种情况下,我建议使用 Spark / PySpark 和 spark-redshift package。 Spark 将在幕后为您执行 UNLOAD,您的数据帧计算可以由 Spark 跨服务器集群并行化。

# Read data from a query
df = spark.read \
  .format("com.databricks.spark.redshift") \
  .option("url", "jdbc:redshift://redshifthost:5439/database?user=username&password=pass") \
  .option("query", "select x, count(*) my_table group by x") \
  .option("tempdir", "s3n://path/for/temp/data") \
  .load()

【讨论】:

我从上面的代码中做了同样的事情,但现在它给了我错误“找不到 Spark jars 目录。你需要在运行这个程序之前构建 Spark。” @乔哈里斯 这可能是因为您可能没有 com.databricks.spark.redshift 包用于输入源的格式,或者因为您没有在命令行或在火花上下文配置。尝试将格式更改为the supportive native types 之一。格式应与您在 S3 中使用的文件相同。

以上是关于如何在 python 中从 redshift 更快地处理数据?的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中从 JSON 字符串中提取数据时出错(使用 Redshift)

如何在 Redshift 中从不同数据库中选择表

在 Redshift SQL 中从数组中提取值

Redshift - 在 where 子句中从 csv 传递值

在 docker 容器超时中从 s3 复制到 Redshift

Postgres / Redshift:在一次调用中从组的日期列中提取季度和年份?