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



我的小数列" tot_amt"定义为类型"字节"和逻辑类型的"小数"。

使用databricks spark-avro在SPARK中创建数据框后,当我尝试使用 tot_amt 列总和函数列出"函数sum需要数字类型不是binaryType"错误时,

该列的定义如下所示,

name =" tot_amt"," type":[" null",{" type":" bytes"," logicalType":" Decimal"," Decimal"," Precision":20," scale":10}]

我正在创建数据框架,然后总结

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

似乎在创建数据框时将小数值读成二进制型。在这种情况下,我们如何在此类十进制列上执行数字操作?是否可以将此字节数组转换为bigdecimal,然后执行计算。

根据AVRO的支持类型 -> SPARK SQL转换,bytes AVRO类型转换为Spark SQL的BinaryType(另请参见代码)。

根据源代码,您可以使用avroSchema选项来定义自己的自定义模式,即

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

这为您提供了指定从BinaryTypeDecimal的映射的方法。

您也可以使用cast函数将二进制值铸成其小数格式。

P.S。我不知道读者是否支持AVRO模式中定义的logicaltype提示。如果目前没有这样的功能,这是很高兴的。

相关内容

  • 没有找到相关文章

最新更新