我在胶水作业方面遇到了一些令人沮丧的问题。
我有一个从搜寻器创建的表。它处理了一些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” ),该表最终只是为空。
答案 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")
希望这会有所帮助(: