【发布时间】:2019-06-07 04:16:39
【问题描述】:
我面临着一项不可能将大量数据从 Amazone Redshift 提取到另一个表的任务。它肯定需要一种更有效的方法,但我是 SQL 和 AWS 的新手,所以决定向这个聪明的社区寻求建议。
这是我的初始 SQL 查询,需要很长时间:
-- STEP 1: CREATE A SAMPLE FOR ONE MONTH
SELECT DISTINCT at_id, utc_time, name
INTO my_new_table
FROM s3_db.table_x
WHERE type = 'create'
AND (dt BETWEEN '20181001' AND '20181031');
最好的方法是什么?我正在考虑使用 python 和 sqlalchemy 创建具有 1m 行块的数据帧并将其插入新表(我需要事先创建)。这行得通吗?:
from sqlalchemy import create_engine
import os
import pandas as pd
redshift_user = os.environ['REDSHIFT_USER']
redshift_password = os.environ['REDSHIFT_PASSWORD']
engine_string = "postgresql+psycopg2://%s:%s@%s:%d/%s" \
% (redshift_user, redshift_password, 'localhost', XXXX, 'redshiftdb')
engine = create_engine(engine_string)
for df in pd.read_sql_query("""
SELECT DISTINCT at_id, utc_time, name
INSERT INTO my_new_table
FROM s3_db.table_x
WHERE type = 'create'
AND (dt BETWEEN '20181001' AND '20181031');
""", engine, chunksize=1000000):
【问题讨论】:
-
您正在将数据从一个红移表移动到另一个红移表?
-
是的,没错。
-
数据库操作最终会比去pandas再回redshift要快,问题是现在需要很长时间吗?
-
完全正确 - 几乎不可能完成,因为我时不时地弄坏了管道,一切都松了。有没有办法在 SQL 中分块执行?
-
您需要更详细地了解源表的结构。它是一个实际的 Redshift 表,还是正如名称“s3_db”所暗示的那样,它是一个 Spectrum 表?如果是后者,数据可能作为文件存在于 S3 中,而不是 Redshift 本身,您可以使用其他工具(例如 EMR/Spark、Athena 或 Glue)来创建新数据集。如果它是一个实际的 Redshift 表,那么检查源表的分布键和排序键是什么。如果您可以对排序键应用过滤器,这可能有助于加快查询速度。
标签: python-3.x pandas sqlalchemy amazon-redshift