PySpark实现Snowflake数据导出到Amazon Redshift

ops/2025/2/27 18:26:08/

编写AWS EMR上的高性能PySpark代码,实现用SQL从Snowflake上下载数据到S3里的parquet文件,并导入Redshift表。

步骤一:配置EMR集群

首先确保您已经在AWS EMR上正确地设置了包含适当权限的角色和安全组的集群。该角色应允许访问Snowflake数据库、S3桶以及Redshift集群。

步骤二:连接至Snowflake并提取数据

接下来,我们将使用snowflake-jdbc-driver.jar驱动程序来连接Snowflake数据库并将查询结果加载到Dataframe中。请根据实际情况替换占位符值(例如用户名、密码、账户名称等)。

python">from pyspark.sql import SparkSession# 创建Spark会话对象
spark = SparkSession.builder.appName("LoadFromSnowflakeToS3").getOrCreate()options_snowflake = {"sfURL": "<SNOWFLAKE_ACCOUNT>.snowflakecomputing.com","sfUser": "<USERNAME>","sfPassword": "<PASSWORD>","sfDatabase": "<DATABASE_NAME>","sfSchema": "<SCHEMA_NAME>",  
}query = "(SELECT * FROM <TABLE>)"data_df = spark.read.format("net.snowflake.spark.SNOWFLAKE_SOURCE_JDBC")\.option(**options_snowflake)\.option("dbtable", query).load()

注意事项: 您可能还需要添加其他选项,比如SSL证书路径或代理设置,具体取决于您的网络环境和安全性需求。

步骤三:保存为Parquet格式于S3

一旦我们有了所需的DataFrame (data_df) ,就可以轻松地将其序列化成高效的Parquet格式并存储在指定位置的S3 bucket里。

python">output_path = f"s3a://{bucket_name}/{folder}/"
data_df.write.mode('overwrite').format('parquet').save(output_path)

这里的 mode='overwrite' 表示每次运行都会覆盖已存在的同名目录;如果您希望保留旧版记录而不被新版本替代的话,请改为 'append' 。另外别忘了提供正确的IAM策略给EC2节点以便它们能够向目标Bucket写入数据。

步骤四:将Parquet文件载入Redshift

现在我们需要借助COPY命令将上述生成的Parquet文件批量复制进Redshift的一个表格里面。为此目的,通常我们会采用UNLOAD方法配合Manifest文件的方式来进行更复杂的场景管理,但在这里为了简化流程,我仅展示基本语法供参考:

方法A: 使用JDBC Driver 直接插入 Redshift (适用于小规模数据集)

这种方法并不推荐用于大规模作业,因为它依赖单个Executor线程逐条推送数据进去,效率低下且容易导致超时错误。

INSERT INTO redshift_table SELECT * FROM snowflake_view;

但是由于我们在之前已经完成了ETL过程并且得到了优化后的Parquet输出,所以建议采取第二种方案:

方法B: 利用 COPY 命令高效传输大容量 Parquet 文件

这是最佳实践方式,因为它是多线程化的,并能充分利用Redshift内部压缩机制提高吞吐率。

准备阶段:
  • 创建外部分区表: 定义一个临时外表指向刚才存放在 S3 上的所有 .parqeut 文件片段。
  • 授权 IAM 角色: 确保关联到 Redshift 的 EC2 实例拥有足够的权限去读取相应 Bucket 内容。
示例脚本:
CREATE EXTERNAL SCHEMA IF NOT EXISTS ext_schema_from_parquets
FROM DATA CATALOG DATABASE '<glue_database>'
REGION AS '<region>';GRANT USAGE ON SCHEMA ext_schema_from_parquets TO GROUP your_group;-- 如果没有Glue Catalog可用,则手动定义EXTERNAL TABLE如下所示:
/*
CREATE EXTERNAL TABLE schema.ext_table (column1 datatype,...
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
LOCATION 's3://path/to/output/';
*/-- 执行实际COPY操作
COPY target_redshift_table
FROM '{manifest_file}'
CREDENTIALS 'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secret-access-key>' -- or better practice with iam role arn instead!
MANIFEST GZIP REGION '<region>';

请注意替换 {manifest_file} 为您所拥有的清单文档的实际地址,这个JSON文件应该列出所有的.parquet分片及其大小信息。此外,出于安全原因强烈建议不要硬编码凭证字符串而是改用预设的服务账号身份验证途径。


http://www.ppmy.cn/ops/161745.html

相关文章

【设计模式】【创建型模式】单例模式(Singleton)

&#x1f44b;hi&#xff0c;我不是一名外包公司的员工&#xff0c;也不会偷吃茶水间的零食&#xff0c;我的梦想是能写高端CRUD &#x1f525; 2025本人正在沉淀中… 博客更新速度 &#x1f44d; 欢迎点赞、收藏、关注&#xff0c;跟上我的更新节奏 &#x1f3b5; 当你的天空突…

暨南大学智科院电子信息复试Tips

暨南大学智科院人工智能(电子信息)的总成绩初试成绩X初试权重复试折合成绩X复试权重(复试权重为50%&#xff0c;初试权重为50%)&#xff0c;也就是说复试占比与初试占比五五开&#xff0c;所以复试也是非常重要的&#xff0c;往年都有初试高分选手复试被刷的情况&#xff0c;同…

【Python爬虫(90)】以Python爬虫为眼,洞察金融科技监管风云

【Python爬虫】专栏简介&#xff1a;本专栏是 Python 爬虫领域的集大成之作&#xff0c;共 100 章节。从 Python 基础语法、爬虫入门知识讲起&#xff0c;深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑&#xff0c;覆盖网页、图片、音频等各类数据爬取&#xff…

爬虫解析库:parsel的详细使用

文章目录 1. 安装 Parsel2. 基本用法3. 使用 CSS 选择器提取数据4. 使用 XPath 提取数据5. 链式调用6. 正则表达式提取7. 处理嵌套元素8. 处理默认值9. 结合 Requests 使用10. 处理复杂 HTML11. 性能优化12. 注意事项 引言&#xff1a;本博客详细介绍爬虫解析库parser的详细使用…

读书笔记 - 码农心得(重学Java设计模式)

读书笔记 - 码农心得&#xff08;重学Java设计模式&#xff09; 粗暴的开发方式可以归纳为三步&#xff1a;定义属性&#xff0c;创建方法&#xff0c;调用展示。虽然初次实现很快&#xff0c;但不便于后期维护和扩展。 真正好的代码不只为了完成现有功能&#xff0c;更会考虑后…

C++ | 设计模式 | 代理模式

代理模式&#xff08;Proxy Pattern&#xff09; 代理模式是一种结构型设计模式 &#xff0c;它为某个对象提供一个代理&#xff0c;以控制对该对象的访问。代理模式可以在不改变原始对象的情况下&#xff0c;通过引入代理对象来扩展功能或控制对原始对象的访问。 核心思想 代…

WPS接入DeepSeek模型免费版本

WPS灵犀正式上线DeepSeek R1&#xff01; 参考原文&#xff1a;WPS接入DeepSeek模型免费版本 今年年初&#xff0c;WPS 官方正式发布重磅消息&#xff1a;WPS 全面接入 DeepSeek R1 大模型。用户只需将 WPS 更新到最新版本&#xff0c;登录账号后&#xff0c;点击界面左侧的「…

解锁C# XML编程:从新手到实战高手的蜕变之路

一、引言&#xff1a;XML 在 C# 中的关键地位 在 C# 开发的广袤领域中&#xff0c;XML&#xff08;可扩展标记语言&#xff0c;eXtensible Markup Language&#xff09;宛如一颗璀璨的明星&#xff0c;占据着举足轻重的地位。它以其独特的结构化和自描述特性&#xff0c;成为了…