我正在使用Apache Nifi 1.9.2将关系数据库中的数据加载到Google Cloud Storage中。目的是将结果以列方式存储到Parquet文件中。为此,我使用了Nifi中的ConvertAvroToParquet(默认设置)处理器(其次是PutGCSObject处理器)。这些生成的文件的问题是,在使用Spark 2.4.0(scala 2.11.12)中的文件时,我无法读取十进制类型的列:无法转换Parquet列...列:[ARHG3A],预期:十进制(2, 0),找到:BINARY
链接到镶木地板/ 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)会导致错误:Parquet列不能在文件file:/// C:/ARHG.parquet中转换。列:[ARHG3A],期望值:十进制(2,0),发现:BINARY
答案 0 :(得分:0)
为此,我利用了Nifi中的ConvertAvroToParquet(默认设置)处理器(随后是PutGCSObject处理器)
尝试升级到我们的最新版本NiFi 1.12.1。在处理小数点方面进行了一些改进,可能适用于此。另外,您可以使用Parquet读写器服务从1.1.0.0版本开始将Avro转换为Parquet。如果这不起作用,则可能是应该向其提交Jira票证的错误。