AWS Glue ApplyMapping从双精度到字符串

时间:2018-06-20 10:04:53

标签: amazon-web-services aws-glue

我在胶水作业方面遇到了一些令人沮丧的问题。

我有一个从搜寻器创建的表。它处理了一些CSV数据并创建了一个架构。模式的某些元素需要修改,例如数字到字符串并应用标题。

我似乎在这里遇到了一些问题-某些字段的模式似乎已经变成了双重。当我尝试将其转换为我需要的字符串时,它包含一些空精度,例如1234-> 1234.0。

我拥有的映射代码如下:

applymapping1 = ApplyMapping.apply(
    frame = datasource0, 
    mappings = [
        ("col1","double","first_column_name","string"),
        ("col2","double","second_column_name","string")
    ], 
    transformation_ctx = "applymapping1"
 )

对数据进行爬网后得到的结果表如下所示:

first_column_name    second_column_name
1234.0               4321.0
5678.0               8765.0

相对

first_column_name    second_column_name
1234                 4321
5678                 8765

是否有解决此问题的好方法?我尝试将最初由搜寻器创建的表中的架构更改为bigint而不是double,但是当我将映射代码更新为(“ col1”,“ bigint”,“ first_column_name”,“ string” ),该表最终只是为空。

2 个答案:

答案 0 :(得分:0)

也许您的数据实际上是double类型的(某些值可能有分数),这就是为什么更改类型会导致数据变为null的原因。同样也难怪当您将double字段的类型更改为string时,它会用小数部分序列化-它仍然是双精度的,只是打印出来。

您是否尝试过将值显式转换为整数?

df2 = ResolveChoice.apply(datasource0, specs = [("col1", "cast:int"), ("col2", "cast:int")])

然后区分大小写为字符串

df3 = ResolveChoice.apply(df2, specs = [("col1", "cast:string"), ("col2", "cast:string")])

或使用ApplyMapping来更改类型并重命名,就像上面一样。

df3 = ApplyMapping.apply(
frame = df2, 
mappings = [
    ("col1","int","first_column_name","string"),
    ("col2","int","second_column_name","string")
], 
transformation_ctx = "applymapping1"

答案 1 :(得分:0)

只需对botchniaque答案进行一点更正,实际上您必须同时执行ResolveChoice和ApplyMapping才能确保正确的类型转换。

ResolveChoice将确保您的列中只有一种类型。如果您不执行此步骤并且不确定性仍未解决,则该列将成为结构,Redshift最终会将其显示为null。

因此应用ResolveChoice以确保您的所有数据都是一种类型(例如,int)

df2 = ResolveChoice.apply(datasource0, specs = [("col1", "cast:int"), ("col2", "cast:int")])

最后,使用ApplyMapping更改所需类型

df3 = ApplyMapping.apply(
frame = df2, 
mappings = [
    ("col1","int","first_column_name","string"),
    ("col2","int","second_column_name","string")
], 
transformation_ctx = "applymapping1")

希望这会有所帮助(: