apache-spark - 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
解决方案
为了实现这一点,我使用了 Nifi 中的 ConvertAvroToParquet(默认设置)处理器(其次是 PutGCSObject 处理器)
尝试升级到我们的最新版本 NiFi 1.12.1。对可能适用于此处的小数进行了一些改进。此外,从 ~1.10.0 开始,您现在可以使用 Parquet 读取器和写入器服务从 Avro 转换为 Parquet。如果这不起作用,则可能是一个错误,应该针对它提交 Jira 票证。
推荐阅读
- python - 如何使用 for 循环 while 用列表填充字典的值?
- android - 全新安装 Android Studio + 模拟器,模拟器吃 CPU + 电池
- c++ - 为什么 arr[i++] vs arr[i]++ 这样做?
- sqlite - 布尔变量更新在 SQLite 中表现异常
- reactjs - 反应:将按钮值与输入文本连接起来
- ios - Swift UI 自动从初始屏幕导航到另一个屏幕,并带有延迟时间
- ios - 在没有 Xcode 的情况下制作 Cocoa App,例如:使用 VIM 进行编辑和 Swift 编译器
- image - 在 react-native 中,我如何在 ios 和 android 的图像上添加水印
- java - 在android上拆分逗号和一一显示值
- reactjs - 如何在 React Native 中在没有 setState 的情况下更改点击视图区域