Pyspark 动态帧写入额外列

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

我有一个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 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来解决这个问题。