【发布时间】:2021-10-13 16:18:36
【问题描述】:
我正在尝试将 PySpark 数据帧写入 AWS Redshift。
我正在使用postActions 参数进行删除。
但是这个 sn-p 需要很长时间才能完成。
有没有办法提高DATAFRAME.write的速度?
from pyspark import SparkContext
from pyspark.sql import SQLContext, types
EXTRACOPYOPTIONS = "TRUNCATECOLUMNS EMPTYASNULL BLANKSASNULL TRIMBLANKS ACCEPTANYDATE TIMEFORMAT 'auto' MAXERROR 0 DATEFORMAT 'auto'"
postActions = f"""
DELETE FROM {MASTER_TABLE} USING {staging} WHERE {MASTER_TABLE}.{key_to_update} = {staging}.{key_to_update};
DROP TABLE IF EXISTS {staging}
"""
DATAFRAME.write \
.format("com.databricks.spark.redshift") \
.option("url", REDSHIFT_JDBC_URL) \
.option("dbtable", staging) \
.option("extracopyoptions", EXTRACOPYOPTIONS) \
.option("postactions", postActions) \
.option("forward_spark_s3_credentials", "true") \
.option("tempdir", "s3a://"+S3_BUCKET+"/tempdir") \
.mode("append") \
.save()
DATAFRAME.write \
.format("com.databricks.spark.redshift") \
.option("url", REDSHIFT_JDBC_URL) \
.option("dbtable", MASTER_TABLE) \
.option("extracopyoptions", EXTRACOPYOPTIONS) \
.option("forward_spark_s3_credentials", "true") \
.option("tempdir", "s3a://"+S3_BUCKET+"/tempdir") \
.mode("append") \
.save()```
【问题讨论】:
-
对日期/时间格式使用“自动”是个坏主意。您不知道 Redshift 是否选择了正确的格式。有时会出错。
-
会不会影响写入性能,假设时间格式正确指定source
DATAFRAME -
写入是 spark 中的一个动作。由于您要编写两次,因此整个 DAG 由 spark 计算两次。您可以查看 Spark History Server 并查看 spark 阶段吗?当我们对同一个 DF 有多个操作时,最好使用 df.cache() 缓存 df。
-
我会调查的。但是是否建议使用
pyspark只写s3,然后使用redshiftcopy命令转移到redshift。那会比上面提到的方法更快吗
标签: python pyspark amazon-redshift