【问题标题】:How to read decimal logical type into spark dataframe如何将十进制逻辑类型读入火花数据帧
【发布时间】:2018-11-16 11:15:57
【问题描述】:

我有一个包含十进制逻辑类型的 Avro 文件,如下所示:

"type":["null",{"type":"bytes","logicalType":"decimal","precision":19,"scale":2}]


当我尝试使用 scala spark 库读取文件时,df 架构是

MyField: binary (nullable = true)


如何将其转换为十进制类型?

【问题讨论】:

    标签: scala apache-spark avro spark-avro


    【解决方案1】:

    您可以在读取操作中指定架构:

    val schema = new StructType()
        .add(StructField("MyField", BooleanType))
    

    或者你可以投列

    val binToInt: String => Integer = Integer.ParseInt(_, 2);
    val binToIntegerUdf = udf(binToInt);
    
    df.withColumn("Myfield", binToIntegerUdf(col("MyField").cast("string")))
    

    【讨论】:

    • 转换解决方案引发以下错误:由于数据类型不匹配,无法解析“CAST(MyField AS DECIMAL(10,0))”:无法将二进制转换为十进制(10,0);
    • 已更新。您可以编写自己的函数来执行此操作并将其保存为 udf。
    • 此解决方案不起作用。 binary 不能将 cast 编入 decimal。将其转换为string 会将基础Array[Byte] 转换为String。它不返回小数的字符串表示形式
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多