在序列化数据中找不到必填字段“uncompressed_pa​​ge_size”!镶木地板

Posted

技术标签:

【中文标题】在序列化数据中找不到必填字段“uncompressed_pa​​ge_size”!镶木地板【英文标题】:Required field 'uncompressed_page_size' was not found in serialized data! Parquet 【发布时间】:2017-11-09 20:57:19 【问题描述】:

尝试使用 pyspark 从本地目录保存镶木地板文件时出现以下错误。 我试过 spark 1.6 和 2.2 都给出同样的错误

它可以正确显示架构,但在写入文件时会出错。

    base_path = "file:/Users/xyz/Documents/Temp/parquet"
    reg_path = "file:/Users/xyz/Documents/Temp/parquet/ds_id=48"
    df = sqlContext.read.option( "basePath",base_path).parquet(reg_path)
    out_path = "file:/Users/xyz/Documents/Temp/parquet/out"
    df2 = df.coalesce(5)
    df2.printSchema()
    df2.write.mode('append').parquet(out_path)

 org.apache.spark.SparkException: Task failed while writing rows
    Caused by: java.io.IOException: can not read class org.apache.parquet.format.PageHeader: Required field 'uncompressed_page_size' was not found in serialized data! Struct: PageHeader(type:null, uncompressed_page_size:0, compressed_page_size:0)

【问题讨论】:

什么 hadoop 发行版? 我在本地机器上运行它。所以我只是安装了spark我没有安装Hadoop。 本地有什么spark版本? 我用 spark 1.6 和 2.2.0 都试过了 您安装了哪个 Java 版本? 【参考方案1】:

在我自己的例子中,我正在为 Apache Tika 编写一个自定义 Parquet Parser,我遇到了这个错误。事实证明,如果文件正被另一个进程使用,ParquetReader 将无法访问uncompressed_page_size。因此,导致错误。

验证其他进程是否没有保留该文件。

【讨论】:

【参考方案2】:

由 spark config 临时解决:

"spark.sql.hive.convertMetastoreParquet": "false"

虽然会产生额外费用,但现在是一种绕开的方法。

【讨论】:

以上是关于在序列化数据中找不到必填字段“uncompressed_pa​​ge_size”!镶木地板的主要内容,如果未能解决你的问题,请参考以下文章

DataContractSerializer:在流中找不到引用 id 'xyz' 的反序列化对象。如何恢复数据?

Django-Rest-Framework POST 对象字段必填

EclipseLink JPA NamedQuery 在 Set 类型的字段中找不到 .size 属性

未检查/强制执行 Protobuf C++ 必填字段

在“...”字段中找不到名称为“...”的参数

排毒:在 Info.plist 中找不到字段 CFBundleIdentifier