更改 AWS Glue 中的读取会如何更改列的数据类型?

How would chaning the read in AWS Glue change a column's data type?

我有一个稍微修改过的 AWS Glue 作业,只有读取发生了变化,作业运行正常,但我的列上的数据类型发生了变化。在我以前有 BigInt 的地方,我现在只有 Ints。这会导致依赖于这些文件的 EMR 作业因模式不匹配而出错。我不确定是什么导致了这个问题,因为映射没有改变,所以如果有人有洞察力,那么这里是旧代码和新代码:

///OLD
val inputsourceDF = spark.read.format("json").load(inputFilePath)
val inputsource = DynamicFrame(inputsourceDF, glueContext)
///NEW
val inputsource = glueContext.getSourceWithFormat(connectionType = "s3",  options = JsonOptions(Map("paths" -> Set(inputFilePath))), format = "json", transformationContext = "inputsource").getDynamicFrame()

///WRITE which did not change
val inputsink = glueContext.getSinkWithFormat(connectionType = "s3", options = JsonOptions(s"""{"path": "$inputOutputFilePath"}"""), transformationContext = "inputdatasink", format = "parquet").writeDynamicFrame(inputdropnullfields.coalesce(inputPartitionCount))

这些是胶水作业后抓取文件时创建的表

CREATE EXTERNAL TABLE `input_new`(`id` int)

CREATE EXTERNAL TABLE `input_old`(`id` bigint)

我们添加了此更改以便我们可以使用书签,我们将不胜感激。

spark DataFrame 和 glue DynamicFrame 在从 json 读取数据时都会推断模式,但显然,它们的做法不同:spark 将所有数值视为 bigint,而胶水试图变得聪明,并且(我猜)会即时查看实际值范围。

可以找到有关 DynamicFrame 模式推断的更多信息 here

如果你最终还是要编写 parquet,并且希望模式稳定一致,我想说你最简单的方法就是还原你的更改并返回到 spark DataFrame . 您也可以在读取数据后使用 apply_mapping 显式更改类型,但这似乎违背了首先使用 dynamic 框架的目的。