You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@spark.apache.org by "Sean Owen (JIRA)" <ji...@apache.org> on 2015/04/24 02:44:39 UTC

[jira] [Updated] (SPARK-6016) Cannot read the parquet table after overwriting the existing table when spark.sql.parquet.cacheMetadata=true

     [ https://issues.apache.org/jira/browse/SPARK-6016?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Sean Owen updated SPARK-6016:
-----------------------------
    Assignee: Yin Huai

> Cannot read the parquet table after overwriting the existing table when spark.sql.parquet.cacheMetadata=true
> ------------------------------------------------------------------------------------------------------------
>
>                 Key: SPARK-6016
>                 URL: https://issues.apache.org/jira/browse/SPARK-6016
>             Project: Spark
>          Issue Type: Bug
>          Components: SQL
>            Reporter: Yin Huai
>            Assignee: Yin Huai
>            Priority: Blocker
>             Fix For: 1.3.0
>
>
> saveAsTable is fine and seems we have successfully deleted the old data and written the new data. However, when reading the newly created table, an error will be thrown.
> {code}
> Error in SQL statement: java.lang.RuntimeException: java.lang.RuntimeException: could not merge metadata: key org.apache.spark.sql.parquet.row.metadata has conflicting values: 
> at parquet.hadoop.api.InitContext.getMergedKeyValueMetaData(InitContext.java:67)
> 	at parquet.hadoop.api.ReadSupport.init(ReadSupport.java:84)
> 	at org.apache.spark.sql.parquet.FilteringParquetRowInputFormat.getSplits(ParquetTableOperations.scala:469)
> 	at parquet.hadoop.ParquetInputFormat.getSplits(ParquetInputFormat.java:245)
> 	at org.apache.spark.sql.parquet.ParquetRelation2$$anon$1.getPartitions(newParquet.scala:461)
> 	...
> {code}
> If I set spark.sql.parquet.cacheMetadata to false, it's fine to query the data. 
> Note: the newly created table needs to have more than one file to trigger the bug (if there is only a single file, we will not need to merge metadata). 
> To reproduce it, try...
> {code}
> import org.apache.spark.sql.SaveMode
> import sqlContext._
> sql("drop table if exists test")
> val df1 = sqlContext.jsonRDD(sc.parallelize((1 to 10).map(i => s"""{"a":$i}"""), 2)) // we will save to 2 parquet files.
> df1.saveAsTable("test", "parquet", SaveMode.Overwrite)
> sql("select * from test").collect.foreach(println) // Warm the FilteringParquetRowInputFormat.footerCache
> val df2 = sqlContext.jsonRDD(sc.parallelize((1 to 10).map(i => s"""{"b":$i}"""), 4)) // we will save to 4 parquet files.
> df2.saveAsTable("test", "parquet", SaveMode.Overwrite)
> sql("select * from test").collect.foreach(println)
> {code}
> For this example, we have two outdated footers for df1 in footerCache and since we have four parquet files for the new test table, we picked up 2 new footers for df2. Then, we hit the bug.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

---------------------------------------------------------------------
To unsubscribe, e-mail: issues-unsubscribe@spark.apache.org
For additional commands, e-mail: issues-help@spark.apache.org