我的小数列" 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)
这为您提供了指定从BinaryType
到Decimal
的映射的方法。
您也可以使用cast
函数将二进制值铸成其小数格式。
P.S。我不知道读者是否支持AVRO模式中定义的logicaltype
提示。如果目前没有这样的功能,这是很高兴的。