首页 > 解决方案 > Parquet 列无法转换:预期十进制,找到二进制

问题描述

我正在使用 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=分享

我知道 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

标签: apache-sparkapache-nifiparquet

解决方案


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

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


推荐阅读