akmxl 2020-02-14 00:27 采纳率: 0%
浏览 463

spark读取avro序列化的parquet时报错:Illegal Parquet type: FIXED_LEN_BYTE_ARRAY

avro格式定义如下图:图片说明
然后spark正常读取生成的parquet则报错:Illegal Parquet type: FIXED_LEN_BYTE_ARRAY。问怎么读取parquet(不一定要用spark)?详细错误如下:
org.apache.spark.sql.AnalysisException: Illegal Parquet type: FIXED_LEN_BYTE_ARRAY;
at org.apache.spark.sql.execution.datasources.parquet.ParquetToSparkSchemaConverter.illegalType$1(ParquetSchemaConverter.scala:107)
at org.apache.spark.sql.execution.datasources.parquet.ParquetToSparkSchemaConverter.convertPrimitiveField(ParquetSchemaConverter.scala:175)
at org.apache.spark.sql.execution.datasources.parquet.ParquetToSparkSchemaConverter.convertField(ParquetSchemaConverter.scala:89)
at org.apache.spark.sql.execution.datasources.parquet.ParquetToSparkSchemaConverter.$anonfun$convert$1(ParquetSchemaConverter.scala:71)
at scala.collection.TraversableLike.$anonfun$map$1(TraversableLike.scala:237)
at scala.collection.Iterator.foreach(Iterator.scala:941)
at scala.collection.Iterator.foreach$(Iterator.scala:941)
at scala.collection.AbstractIterator.foreach(Iterator.scala:1429)
at scala.collection.IterableLike.foreach(IterableLike.scala:74)
at scala.collection.IterableLike.foreach$(IterableLike.scala:73)
at scala.collection.AbstractIterable.foreach(Iterable.scala:56)
at scala.collection.TraversableLike.map(TraversableLike.scala:237)
at scala.collection.TraversableLike.map$(TraversableLike.scala:230)
at scala.collection.AbstractTraversable.map(Traversable.scala:108)
at org.apache.spark.sql.execution.datasources.parquet.ParquetToSparkSchemaConverter.convert(ParquetSchemaConverter.scala:65)
at org.apache.spark.sql.execution.datasources.parquet.ParquetToSparkSchemaConverter.convert(ParquetSchemaConverter.scala:62)
at org.apache.spark.sql.execution.datasources.parquet.ParquetFileFormat$.$anonfun$readSchemaFromFooter$2(ParquetFileFormat.scala:664)
at scala.Option.getOrElse(Option.scala:138)
at org.apache.spark.sql.execution.datasources.parquet.ParquetFileFormat$.readSchemaFromFooter(ParquetFileFormat.scala:664)
at org.apache.spark.sql.execution.datasources.parquet.ParquetFileFormat$.$anonfun$mergeSchemasInParallel$2(ParquetFileFormat.scala:621)
at org.apache.spark.rdd.RDD.$anonfun$mapPartitions$2(RDD.scala:801)
at org.apache.spark.rdd.RDD.$anonfun$mapPartitions$2$adapted(RDD.scala:801)
at org.apache.spark.rdd.MapPartitionsRDD.compute(MapPartitionsRDD.scala:52)
at org.apache.spark.rdd.RDD.computeOrReadCheckpoint(RDD.scala:324)

  • 写回答

1条回答 默认 最新

  • 大大怪打LZR 2023-08-13 21:49
    关注

    根据您提供的错误信息,似乎问题出在Parquet文件的数据类型不匹配上。Parquet文件中的数据类型与读取器(例如Spark)期望的数据类型不一致。

    根据您的问题描述,您的Avro架构定义中可能使用了 FIXED 数据类型,而这在Parquet文件中通常对应于 FIXED_LEN_BYTE_ARRAY 类型。然而,Spark 默认情况下可能不支持直接将 Parquet 文件中的 FIXED_LEN_BYTE_ARRAY 数据类型映射到 Spark 数据类型。

    为了解决这个问题,您可以考虑以下几种方法:

    1. 自定义Schema映射: 尝试使用自定义的Schema映射来将 Parquet 文件中的 FIXED_LEN_BYTE_ARRAY 数据类型转换为Spark支持的数据类型。您可以通过在读取Parquet文件时提供一个自定义的Schema来实现这一点。

    2. 升级Spark版本: 有时候问题可能是特定版本的Spark引起的,尝试升级到较新的Spark版本可能会解决某些问题,因为Spark不断在版本中改进Parquet读写支持。

    3. 数据转换: 在读取Parquet文件之前,将其转换为适合Spark的数据格式,例如CSV或JSON。然后,您可以使用Spark读取这些转换后的文件。

    4. Parquet工具: 使用Parquet文件的命令行工具,例如Apache Parquet Tools,可以提供关于Parquet文件的更多信息,有时可以揭示出数据类型不匹配的问题。

    最好的方法可能会取决于您的具体情况。您还可以根据具体的Avro架构和Parquet文件内容,尝试调整Schema映射或转换数据格式以解决问题。

    评论

报告相同问题?

悬赏问题

  • ¥35 平滑拟合曲线该如何生成
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 自己瞎改改,结果现在又运行不了了
  • ¥15 链式存储应该如何解决
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站