如何在 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 - 在 where 子句中从 csv 传递值