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映射或转换数据格式以解决问题。

    评论

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器