Python 截断红移表

Python 截断红移表,python,amazon-web-services,pyspark,amazon-redshift,aws-glue,Python,Amazon Web Services,Pyspark,Amazon Redshift,Aws Glue,我创建了一个胶水作业,将数据从S3(csv文件)复制到红移。它工作并填充所需的表 但是,我需要在此过程中清除该表,因为在该过程完成后,我会留下重复的记录 我正在寻找一种方法,将此清除添加到粘合过程中。如有任何建议,将不胜感激 谢谢。你看了吗?这是一项保持高水位的功能,仅适用于s3。我不是100%确定,但它可能需要分区到位 您需要修改Glue提供的自动生成代码。使用spark jdbc连接连接到redshift并执行清除查询 在redshift VPC中旋转胶水容器;在粘合作业中指定连接,以获得对

我创建了一个胶水作业,将数据从S3(csv文件)复制到红移。它工作并填充所需的表

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

我正在寻找一种方法,将此清除添加到粘合过程中。如有任何建议,将不胜感激


谢谢。

你看了吗?这是一项保持高水位的功能,仅适用于s3。我不是100%确定,但它可能需要分区到位

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

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


希望这能有所帮助。

您可以使用spark/Pyspark databricks库在截断表之后执行追加(这比覆盖性能更好):

preactions=“截断表”
写\
.format(“com.databricks.spark.redshift”)\
.选项(“url”,红移\u url)\
.选项(“dbtable”,红移_表)\
.选项(“用户”,用户)\
.选项(“密码”,readshift\u密码)\
.选项(“aws\u iam\u角色”,红移\u复制\u角色)\
.option(“tempdir”,args[“tempdir”])\
.选项(“预操作”,预操作)\
.mode(“追加”)\
.save()

您可以查看

中的databricks文档。您可以更改Glue脚本以在插入之前执行“预操作”,如下所述:

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


提供的@frobinrobin链接已过时,我多次尝试,即使您提供了错误的语法,也会跳过preactions语句,并且出现重复的行(插入操作已执行!)

试试这个:

只需替换中的语法即可
glueContext.write_dynamic_frame.from_jdbc_conf()
在上面链接到
glueContext.write_dynamic_frame_from_jdbc_conf()
将有效


至少这对我的情况有帮助(AWS Glue job只需将数据插入到Redshift中,而不执行截断表操作)

在尝试向上插入数据时,书签的可能重复不会有帮助。如果记录发生更改,则需要从数据集开始爬网
preactions = "TRUNCATE table <schema.table>" 
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"])\
  .option("preactions", preactions)\
  .mode("append")\
  .save()
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")
## @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()