Pyspark 动态帧写入额外列
我有一个glue任务,从S3读取数据,对数据运行两个SQL查询,并将数据输出到Redshift。我遇到了一个奇怪的问题,在将Pyspark 动态帧写入额外列,pyspark,amazon-redshift,aws-glue,Pyspark,Amazon Redshift,Aws Glue,我有一个glue任务,从S3读取数据,对数据运行两个SQL查询,并将数据输出到Redshift。我遇到了一个奇怪的问题,在将dynamic\u frame写入红移时(使用glueContext.write\u dynamic\u frame.from\u options)会创建新列。这些是我现有的一些列,其末尾追加了类型。例如,如果我的框架架构如下所示: id: string value: short value2: long ts: timestamp 在红移中,我看到: id varcha
dynamic\u frame
写入红移时(使用glueContext.write\u dynamic\u frame.from\u options
)会创建新列。这些是我现有的一些列,其末尾追加了类型。例如,如果我的框架架构如下所示:
id: string
value: short
value2: long
ts: timestamp
在红移中,我看到:
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
id varchar(256)
value:smallint技巧是将短值转换为整数。Long->bigint似乎适合我。按照aloissiola的建议显式转换类型为我解决了这个问题。具体来说,我使用了dynamicFrame.resolveChoice函数:
changetypes = select1.resolveChoice(
specs=[
("value", "cast:int"),
("value2", "cast:int")
]
)
看起来你也可以选择短型和长型。我对所有列进行了检查并指定了类型。在动态框架上执行printSchema时会得到什么?我想你会有选择的。然后需要运行resolveChoice。在执行我的write_dynamic_框架之前的printSchema
行时,它会打印出来:--value:short
和--value2:long
,我看不到任何与选项相关的内容(但是我以前没有处理过它们)。查看日志输出,我看到的唯一位置是CREATE TABLE语句:RedshiftWriter:CREATE TABLE IF NOT EXISTS TABLE(id VARCHAR(MAX)、value\u short INTEGER、value2\u long INTEGER、ts TIMESTAMP)
,因此出于某种原因,它将其视为一个整数。我几乎肯定我的值在边界内,但我猜我可以将类型声明为int来解决这个问题。