【问题标题】:Parquet column cannot be converted: Expected decimal, Found binaryParquet 列无法转换:预期十进制,找到二进制
【发布时间】:2019-06-17 13:59:58
【问题描述】:

我正在使用 Apache Nifi 1.9.2 将数据从关系数据库加载到 Google Cloud Storage。目的是将结果写入 Parquet 文件,因为它以列方式存储数据。为了实现这一点,我使用了 Nifi 中的 ConvertAvroToParquet(默认设置)处理器(随后是 PutGCSObject 处理器)。这些生成文件的问题是,在使用 Spark 2.4.0(scala 2.11.12)中的文件时,我无法读取十进制类型的列:无法转换 Parquet 列...列:[ARHG3A],预期:十进制(2, 0),找到:二进制

parquet/avro 示例文件的链接: https://drive.google.com/file/d/1PmaP1qanIZjKTAOnNehw3XKD6-JuDiwC/view?usp=sharing https://drive.google.com/file/d/138BEZROzHKwmSo_Y-SNPMLNp0rj9ci7q/view?usp=sharing

据我所知,Nifi 在流文件中的处理器之间使用 Avro 格式,我还编写了 avro 文件(就像它在 ConvertAvroToParquet 处理器之前一样),我可以在 Spark 中读取它。 也可以在 Avro 中不使用逻辑类型,但是最后我会丢失列类型,并且所有列都是字符串(不是首选)。 我也尝试过 PutParquet 处理器,但没有成功。

val arhg_parquet = spark.read.format("parquet").load("ARHG.parquet")
arhg_parquet.printSchema()
arhg_parquet.show(10,false)

printSchema() 给出正确的结果,表明 ARHG3A 是小数(2,0) 执行 show(10,false) 会导致错误:无法在文件 file:///C:/ARHG.parquet 中转换 Parquet 列。列:[ARHG3A],预期:十进制(2,0),找到:BINARY

【问题讨论】:

  • 这个问题涉及多个工具(nifi、spark,甚至 s3),其中有几个步骤。请尽量缩小范围(最好提供一个可重复的示例),以便其他人可以更轻松地提供帮助

标签: apache-spark apache-nifi parquet


【解决方案1】:

为了实现这一点,我在 Nifi 中使用了 ConvertAvroToParquet(默认设置)处理器(其次是 PutGCSObject 处理器)

尝试升级到我们的最新版本 NiFi 1.12.1。对可能适用于此处的小数进行了一些改进。此外,从 ~1.10.0 开始,您现在可以使用 Parquet 读取器和写入器服务从 Avro 转换为 Parquet。如果这不起作用,则可能是一个错误,应该针对它提交 Jira 票证。

【讨论】:

    猜你喜欢
    • 2021-07-29
    • 2023-04-11
    • 2016-02-09
    • 2016-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多