更改 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 框架的目的。
我有一个稍微修改过的 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 框架的目的。