【问题标题】:Dynamic Frame writing extra columns动态框架写入额外的列
【发布时间】:2019-09-15 03:56:38
【问题描述】:

我有一个粘合任务,它正在从 S3 读取数据,对数据运行几个 SQL 查询,并将数据输出到 Redshift。我有一个奇怪的问题,在将dynamic_frame 写入 Redshift(使用glueContext.write_dynamic_frame.from_options)时,正在创建新列。这些是我现有的一些列,类型附加在末尾。例如,如果我的框架架构如下:

id: string
value: short
value2: long
ts: timestamp

我在 Redshift 中看到:

id varchar(256)
value: smallint    <---- The data here is always null
value2: bigint     <---- The data here is always null
ts: timestamp      
value_short: smallint
value2_long: bigint

value_shortvalue2_long 列正在执行时创建(目前正在使用具有 alter table 权限的凭据进行测试)

查看运行的COPY 命令时,我看到命令中有value_shortvalue2_long 列。在使用glueContext.write_dynamic_frame.from_options 编写之前,我没有看到动态框架中存在的列

【问题讨论】:

  • 在动态框架上执行 printSchema 会得到什么?我怀疑你有一些选择。然后需要运行resolveChoice。
  • 在我的 write_dynamic_frame 之前执行printSchema 时,它会打印出:|-- value: short|-- value2: long,我没有看到任何与选择相关的内容(我之前不必处理它们然而)。查看日志输出,我看到value_short 的唯一位置是在 CREATE TABLE 语句中:RedshiftWriter: CREATE TABLE IF NOT EXISTS table ( id VARCHAR(MAX), value_short INTEGER, value2_long INTEGER, ts TIMESTAMP ) 因此,出于某种原因,它将其视为整数。我几乎肯定我的值在界限内,但我猜我可以将类型声明为整数来解决问题。

标签: pyspark amazon-redshift aws-glue


【解决方案1】:

诀窍是将短值转换为整数。 Long -> bigint 似乎对我有用。

【讨论】:

    【解决方案2】:

    按照 aloissiola 的建议明确地转换类型为我解决了这个问题。具体来说,我使用了 dynamicFrame.resolveChoice 函数:

    changetypes = select1.resolveChoice(
            specs=[
                ("value", "cast:int"),
                ("value2", "cast:int")
            ]
        )
    

    看起来您也可以转换为短类型和长类型。 https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-crawler-pyspark-extensions-types.html 我检查并为我的所有列指定了类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-25
      • 2021-02-20
      • 2014-04-18
      • 1970-01-01
      • 2016-01-27
      • 1970-01-01
      相关资源
      最近更新 更多