如何将Avro中的字节列(逻辑类型为十进制)转换为十进制?

时间:2017-03-06 13:07:47

标签: scala apache-spark apache-spark-sql avro spark-avro

我有一个十进制列" TOT_AMT"定义为类型"字节"和逻辑类型"十进制"在我的avro架构中。

使用databricks spark-avro在spark中创建数据框后,当我尝试使用sum函数对 TOT_AMT 列求和时,它会抛出"函数和需要数字类型而不是Binarytype"错误

该列在avro架构中定义如下,

name =" TOT_AMT","输入":[" null",{" type":"字节"" logicaltype":"十进制""精密":20,"刻度" 10}]

我正在创建数据框并总结如下,

val df=sqlContext.read.format("com.databricks.spark.avro").load("input dir")
df.agg(sum("TOT_AMT")).show()

在创建数据帧时,似乎将十进制值读为Binarytype。在这种情况下,我们如何对这样的十进制列执行数值运算?是否可以将此Byte数组转换为BigDecimal,然后执行计算。

1 个答案:

答案 0 :(得分:0)

根据Supported types for Avro -> Spark SQL conversionbytes Avro类型转换为Spark SQL的BinaryType(另请参阅the code)。

根据the source code,您可以使用avroSchema选项定义自己的自定义架构,即

spark.read
  .format("com.databricks.spark.avro")
  .option("avroSchema", yourSchemaHere)

这使您可以指定从BinaryTypeDecimal的映射。

您还可以使用cast函数将二进制值转换为十进制格式。

P.S。我不知道读者是否支持Avro架构中定义的logicaltype提示。如果目前不可用,那么拥有这样的功能会很不错。