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

Dongjoon Hyun resolved SPARK-31345.
-----------------------------------
    Resolution: Duplicate

Thank you for reporting, [~naitree]. This is fixed via SPARK-29462 .

> Spark fails to write hive parquet table with empty array
> --------------------------------------------------------
>
>                 Key: SPARK-31345
>                 URL: https://issues.apache.org/jira/browse/SPARK-31345
>             Project: Spark
>          Issue Type: Bug
>          Components: SQL
>    Affects Versions: 2.3.4, 2.4.5
>         Environment: - Spark 2.4.5 (compiled against hadoop 2.10.0, and 
> bundled with hadoop 2.10.0 dependencies in `spark.yarn.archive`)
> - Hive 3.1.2
> - Hadoop 3.2.1
>            Reporter: Naitree Zhu
>            Priority: Major
>
> When writing an existing Hive Parquet table using Spark SQL, I encountered an 
> error when writing empty `array()` or `map()`.
> Test case to reproduce:
> {code:java}
> spark.sql("create table test_null (col1 array<int>) stored as parquet")
> val df = spark.sql("select cast(array() as array<int>) as col1")
> df.write.format("hive").mode("append").saveAsTable("default.test_null")
> {code}
> Exception raised:
> {code:java}
> 20/04/04 09:16:03 WARN TaskSetManager: Lost task 0.0 in stage 16.0 (TID 30, 
> test-node, executor 2): org.apache.spark.SparkException: Task failed while 
> writing rows.
>       at 
> org.apache.spark.sql.execution.datasources.FileFormatWriter$.executeTask(FileFormatWriter.scala:257)
>       at 
> org.apache.spark.sql.execution.datasources.FileFormatWriter$.$anonfun$write$15(FileFormatWriter.scala:177)
>       at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:90)
>       at org.apache.spark.scheduler.Task.run(Task.scala:123)
>       at 
> org.apache.spark.executor.Executor$TaskRunner.$anonfun$run$3(Executor.scala:411)
>       at org.apache.spark.util.Utils$.tryWithSafeFinally(Utils.scala:1360)
>       at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:414)
>       at 
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
>       at 
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
>       at java.lang.Thread.run(Thread.java:748)
> Caused by: java.lang.RuntimeException: Parquet record is malformed: empty 
> fields are illegal, the field should be ommited completely instead
>       at 
> org.apache.hadoop.hive.ql.io.parquet.write.DataWritableWriter.write(DataWritableWriter.java:64)
>       at 
> org.apache.hadoop.hive.ql.io.parquet.write.DataWritableWriteSupport.write(DataWritableWriteSupport.java:59)
>       at 
> org.apache.hadoop.hive.ql.io.parquet.write.DataWritableWriteSupport.write(DataWritableWriteSupport.java:31)
>       at 
> parquet.hadoop.InternalParquetRecordWriter.write(InternalParquetRecordWriter.java:121)
>       at 
> parquet.hadoop.ParquetRecordWriter.write(ParquetRecordWriter.java:123)
>       at parquet.hadoop.ParquetRecordWriter.write(ParquetRecordWriter.java:42)
>       at 
> org.apache.hadoop.hive.ql.io.parquet.write.ParquetRecordWriterWrapper.write(ParquetRecordWriterWrapper.java:111)
>       at 
> org.apache.hadoop.hive.ql.io.parquet.write.ParquetRecordWriterWrapper.write(ParquetRecordWriterWrapper.java:124)
>       at 
> org.apache.spark.sql.hive.execution.HiveOutputWriter.write(HiveFileFormat.scala:149)
>       at 
> org.apache.spark.sql.execution.datasources.SingleDirectoryDataWriter.write(FileFormatDataWriter.scala:137)
>       at 
> org.apache.spark.sql.execution.datasources.FileFormatWriter$.$anonfun$executeTask$1(FileFormatWriter.scala:245)
>       at 
> org.apache.spark.util.Utils$.tryWithSafeFinallyAndFailureCallbacks(Utils.scala:1394)
>       at 
> org.apache.spark.sql.execution.datasources.FileFormatWriter$.executeTask(FileFormatWriter.scala:242)
>       ... 9 more
> Caused by: parquet.io.ParquetEncodingException: empty fields are illegal, the 
> field should be ommited completely instead
>       at 
> parquet.io.MessageColumnIO$MessageColumnIORecordConsumer.endField(MessageColumnIO.java:244)
>       at 
> org.apache.hadoop.hive.ql.io.parquet.write.DataWritableWriter.writeArray(DataWritableWriter.java:186)
>       at 
> org.apache.hadoop.hive.ql.io.parquet.write.DataWritableWriter.writeValue(DataWritableWriter.java:113)
>       at 
> org.apache.hadoop.hive.ql.io.parquet.write.DataWritableWriter.writeGroupFields(DataWritableWriter.java:89)
>       at 
> org.apache.hadoop.hive.ql.io.parquet.write.DataWritableWriter.write(DataWritableWriter.java:60)
>       ... 21 more
> {code}
> However, letting spark to create the table implicitly, it would succeed.
> {code:java}
> spark.sql("drop table default.test_null")
> df.write.format("parquet").mode("append").saveAsTable("default.test_null")
> {code}



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

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

Reply via email to