【问题标题】:Duplicate column exception when reading Parquet files from S3A using Spark使用 Spark 从 S3A 读取 Parquet 文件时出现重复列异常
【发布时间】:2017-02-11 19:33:35
【问题描述】:

我有一个包含多个 Int8 和 String 列的架构,我已将它们写入 Parquet 格式并存储在 S3A 存储桶中以供以后使用。

当我尝试使用 SqlContext.read.option("mergeSchema","false").parquet("s3a://....") 读取此 parquet 文件时,出现以下异常。

我曾尝试使用 parquet-tools(带有模式和元选项)来读取 parquet 文件,但出现未知命令错误。

*Exception in thread "main" org.apache.spark.sql.AnalysisException: Duplicate column(s) : "Int8", "String" found, cannot save to parquet format;
    at org.apache.spark.sql.execution.datasources.parquet.ParquetRelation.checkConstraints(ParquetRelation.scala:190)
    at org.apache.spark.sql.execution.datasources.parquet.ParquetRelation.dataSchema(ParquetRelation.scala:199)
    at org.apache.spark.sql.sources.HadoopFsRelation.schema$lzycompute(interfaces.scala:561)
    at org.apache.spark.sql.sources.HadoopFsRelation.schema(interfaces.scala:560)
    at org.apache.spark.sql.execution.datasources.LogicalRelation.<init>(LogicalRelation.scala:37)
    at org.apache.spark.sql.SQLContext.baseRelationToDataFrame(SQLContext.scala:395)
    at org.apache.spark.sql.DataFrameReader.parquet(DataFrameReader.scala:267)
    at org.apache.spark.sql.SQLContext.parquetFile(SQLContext.scala:1052)
    :
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.spark.deploy.SparkSubmit$.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:674)
    at org.apache.spark.deploy.SparkSubmit$.doRunMain$1(SparkSubmit.scala:180)
    at org.apache.spark.deploy.SparkSubmit$.submit(SparkSubmit.scala:205)
    at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:120)
    at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)*

如何确保正确写入镶木地板文件?有人知道如何解决此重复列错误吗?

【问题讨论】:

    标签: apache-spark amazon-s3 parquet


    【解决方案1】:

    问题是由于 parquet 文件已损坏。一旦我使用 parquet-tools 确保 parquet 格式正确,我就可以将 parquet 文件读回 Spark。

    【讨论】:

      【解决方案2】:

      试试这个

      SqlContext.read.option("mergeSchema","true").parquet("s3a://....")
      

      这是documentation

      【讨论】:

      • 感谢您的快速回复。不幸的是没有帮助。
      • 我无法粘贴整个代码,但如果有帮助,我会成功读取 parquet 并写入 s3a,我正在尝试从 S3A val engf = sqlContext.read.option("mergeSchema" , "true").parquet("s3a://")
      • 你能不能更具体一点,比如,使用 parquet 文件创建数据框,然后再写回,类似这样。
      • 我的本地 FS 上有镶木地板数据。我将其读入数据帧并将其写入 S3(这是我无法共享的代码部分,抱歉),我正在尝试从 S3 存储桶中读回镶木地板文件。我有几列 int8 和 string 类型,我相信当 sqlContext.read 遇到具有相同类型的重复列时会引发异常。我也不确定为什么异常说,当我尝试读取镶木地板数据时,无法保存为镶木地板格式。
      猜你喜欢
      • 2018-04-26
      • 2016-08-23
      • 2020-10-28
      • 1970-01-01
      • 2018-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多