1

我有一个十进制列“TOT_AMT”,在我的 avro 模式中定义为类型“字节”和逻辑类型“十进制”。

在使用 databricks spark-avro 在 spark 中创建数据框后,当我尝试使用 sum 函数对TOT_AMT列求和时,它会抛出"Function sum requires numeric types not Binarytype" 错误

该列在 avro 模式中定义如下,

name="TOT_AMT","type":["null",{ "type":"bytes","logicaltype":"decimal","precision":20,"scale":10}]

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

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

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

4

1 回答 1

0

根据Supported types for Avro -> Spark SQL conversionbytesAvro 类型被转换为 Spark SQL BinaryType(另见代码)。

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

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

这使您可以指定从BinaryType到的映射Decimal

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

ps 我不知道读者是否支持logicaltype在 Avro 模式中定义的提示。如果目前没有这样的功能,那就太好了。

于 2017-03-31T08:42:26.030 回答