Python 3.x 使用python从AWS红移加载数据
我面临的任务是无法从一个表中提取大量数据到另一个表中。这当然需要一种更有效的方法,但我对SQL和AWS还不熟悉,所以决定向这个智能社区寻求建议 这是我的初始SQL查询,需要花费很长时间:Python 3.x 使用python从AWS红移加载数据,python-3.x,pandas,sqlalchemy,amazon-redshift,Python 3.x,Pandas,Sqlalchemy,Amazon 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 '
-- 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):
你应该使用
这允许您指定SELECT
语句,并将结果直接存储到新表中
这比下载数据并重新上传要高效得多
您还可以创建类似于的表,然后用数据加载它。见:
您也可以将
数据卸载到Amazon S3,然后通过复制
再次加载,但使用创建表作为
无疑是最好的选择。您应该使用
这允许您指定SELECT
语句,并将结果直接存储到新表中
这比下载数据并重新上传要高效得多
您还可以创建类似于的表,然后用数据加载它。见:
您也可以
卸载
数据到Amazon S3,然后通过复制
再次加载,但使用创建表作为
无疑是最好的选择。现在看来,您的源数据存储在Amazon S3中,并且您一直使用红移光谱表(指向S3中的数据)作为源
首选的方法是:
- 使用Amazon Redshift
命令将数据加载到Redshift表中COPY
- 使用
命令将数据从新的红移表提取(ETL)到所需的表中。如果定期执行此操作,则可以使用CREATE TABLE AS
和TRUNCATE
在将来重新加载表INSERT-INTO
- 使用Amazon Redshift
命令将数据加载到Redshift表中COPY
- 使用
命令将数据从新的红移表提取(ETL)到所需的表中。如果定期执行此操作,则可以使用CREATE TABLE AS
和TRUNCATE
在将来重新加载表INSERT-INTO
DISTINCT
替换为groupby
CREATE TABLE AS SELECT
或SELECT to
语句简化ETL过程,其中您可以将转换逻辑放在SELECT组件中,直接将数据从S3加载到红移请参考AWS指南了解红移和频谱最佳实践;我把这些链接放在这篇文章的末尾。基于您的问题,我假设您希望从基于红移光谱的表“s3_db.table_x”提取、转换和加载大量数据到新的红移表“my_new_table” 以下是基于AWS建议的一些建议:
DISTINCT
替换为groupby
CREATE TABLE AS SELECT
或SELECT to
语句简化ETL过程,其中您可以将转换逻辑放在SELECT组件中,直接将数据从S3加载到红移您正在将数据从一个红移表移动到另一个红移表?是的,这是正确的。数据库操作最终会比先运行pandas,然后再返回红移更快,问题是现在需要很长时间?确切地说-几乎不可能完成,因为我一次又一次地遇到断管和松动的所有内容。有没有一种方法可以在SQL中分块执行?您需要更详细地了解源表的结构。它是一个实际的红移表,还是像“s3_db”这个名字所暗示的那样,它是一个频谱表?如果是后者,数据可能作为文件存在于S3中,而不是红移本身,并且您可以潜在地使用ot