【问题标题】:How to convert bytes column (with logicaltype as decimal) in Avro to decimal?如何将 Avro 中的字节列(逻辑类型为十进制)转换为十进制?
【发布时间】:2017-03-06 13:07:46
【问题描述】:

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

使用 databricks spark-avro 在 spark 中创建数据框后,当我尝试使用 sum 函数对 TOT_AMT 列求和时,它会抛出 “函数求和需要数字类型而不是 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再进行计算。

【问题讨论】:

  • 您能否提供您的数据的示意图代码或概览?尤其是减少之前您当前 RDD 的状态可能很重要。显式类型转换很可能会解决问题。

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


【解决方案1】:

根据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 函数将二进制值转换为十进制格式。

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

【讨论】:

  • 有没有办法使用 DataFrame 读取 AVRO 模式元数据(例如:“logicalType”)?我试过“avroDataFrame.schema.fields.map(f=> f.metadata)”但地图是空的?
  • @AshikaUmangaUmagiliya 请提出单独的问题以获得更好的曝光率。我不知道,但认为这是一个重要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-12
  • 2017-05-23
  • 1970-01-01
  • 1970-01-01
  • 2019-09-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多