【发布时间】: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