从PySpark批量加载到AWS RDS(postgres)

时间:2018-09-06 17:31:38

标签: amazon-web-services amazon-rds aws-glue

我正在寻找用于胶水作业的批处理加载器,以使用带有DataFormatWriter的PySpark脚本加载到RDS中。 我为RedShift进行以下工作:

df.write \
    .format("com.databricks.spark.redshift") \
    .option("url", jdbcconf.get("url") + '/' + DATABASE + '?user=' + jdbcconf.get('user') + '&password=' + jdbcconf.get('password')) \
    .option("dbtable", TABLE_NAME) \
    .option("tempdir", args["TempDir"]) \
    .option("forward_spark_s3_credentials", "true") \
    .mode("overwrite") \
    .save()

上面定义了df以便读取文件的位置。在RDS中而不是在REDSHIFT中,我可以采取的最佳方法是什么?

2 个答案:

答案 0 :(得分:0)

在RDS中,您只是APPEND / OVERWRITE,在这种情况下,您可以创建RDS JDBC连接,并使用如下所示的内容:

postgres_url="jdbc:postgresql://localhost:portnum/sakila?user=<user>&password=<pwd>"
df.write.jdbc(postgres_url,table="actor1",mode="append") #for append
df.write.jdbc(postgres_url,table="actor1",mode="overwrite") #for overwrite

如果涉及UPSERTS,则可能可以将MYSQL库用作外部python库,并执行INSERT INTO ..... ON DUPLICATE KEY。

请参考以下网址:How to use JDBC source to write and read data in (Py)Spark?

致谢

Yuva

答案 1 :(得分:0)

我了解到,这只能通过JDBC来完成。例如

df.write.format("jdbc") \
    .option("url", jdbcconf.get("url") + '/' + REDSHIFT_DATABASE + '?user=' + jdbcconf.get('user') + '&password=' + jdbcconf.get('password')) \
    .option("dbtable", REDSHIFT_TABLE_NAME) \
    .option("tempdir", args["TempDir"]) \
    .option("forward_spark_s3_credentials", "true") \
    .mode("overwrite") \
    .save()