【发布时间】: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_short 和 value2_long 列正在执行时创建(目前正在使用具有 alter table 权限的凭据进行测试)
查看运行的COPY 命令时,我看到命令中有value_short 和value2_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