AWS Glue截断红移表

时间:2017-12-29 17:21:42

标签: python amazon-web-services pyspark amazon-redshift aws-glue

我创建了一个将数据从S3(csv文件)复制到Redshift的Glue作业。它可以工作并填充所需的表格。

但是,我需要在此过程中清除表格,因为在流程完成后我会留下重复的记录。

我正在寻找一种方法将此清除添加到Glue流程中。任何建议将不胜感激。

感谢。

4 个答案:

答案 0 :(得分:0)

你看过Job Bookmarks in Glue了吗?这是保持高水位标记的功能,仅适用于s3。我不是100%肯定,但它可能需要分区到位。

答案 1 :(得分:0)

您需要修改Glue提供的自动生成代码。使用spark jdbc连接连接到redshift并执行清除查询。

在红移VPC中旋转胶水容器;在glue作业中指定连接,以获得对redshift集群的访问权。

希望这有帮助。

答案 2 :(得分:0)

您可以使用spark / Pyspark databricks库来覆盖表:

df.write\
  .format("com.databricks.spark.redshift")\
  .option("url", redshift_url)\
  .option("dbtable", redshift_table)\
  .option("user", user)\
  .option("password", readshift_password)\
  .option("aws_iam_role", redshift_copy_role)\
  .option("tempdir", args["TempDir"])\
  .mode("overwrite")\
  .save()

每个Databricks / Spark文档:

  

覆盖现有表:默认情况下,该库使用   事务以执行覆盖,通过删除来实现   目标表,创建一个新的空表并追加行   

您可以在here

中查看databricks文档

答案 3 :(得分:0)

您可以按如下说明更改Glue脚本以在插入之前执行“预检”:

https://aws.amazon.com/premiumsupport/knowledge-center/sql-commands-redshift-glue-job/

datasink4 = glueContext.write_dynamic_frame.from_jdbc_conf(frame
= datasource0, catalog_connection = "test_red", connection_options = {"preactions":"truncate table target_table;","dbtable": "target_table", "database": "redshiftdb"}, redshift_tmp_dir = 's3://s3path', transformation_ctx = "datasink4")

例如,对于我的脚本,该脚本主要基于默认值,我在最后一个DataSink之前插入了一个新的DataSink(我用{things}替换了一些细节):

## @type: DataSink
## @args: [catalog_connection = "redshift-data-live", connection_options = {"dbtable": "{DBTABLE}", "database": "{DBNAME}"}, redshift_tmp_dir = TempDir, transformation_ctx = "datasink4"]
## @return: datasink4
## @inputs: [frame = dropnullfields3]
datasink4 = glueContext.write_dynamic_frame.from_jdbc_conf(frame = dropnullfields3, catalog_connection = "redshift-data-live", connection_options = {"preactions":"truncate table {TABLENAME};","dbtable": "{SCHEMA.TABLENAME}", "database": "{DB}"}, redshift_tmp_dir = args["TempDir"], transformation_ctx = "datasink4")
## @type: DataSink
## @args: [catalog_connection = "redshift-data-live", connection_options = {"dbtable": "{SCHEMA.TABLENAME}", "database": "{DB}"}, redshift_tmp_dir = TempDir, transformation_ctx = "datasink4"]
## @return: datasink5
## @inputs: [frame = datasink4]
datasink5 = glueContext.write_dynamic_frame.from_jdbc_conf(frame = datasink4, catalog_connection = "redshift-data-live", connection_options = {"dbtable": "{SCHEMA.TABLENAME}", "database": "{DB}"}, redshift_tmp_dir = args["TempDir"], transformation_ctx = "datasink5")
job.commit()