首页 文章

Spark:在分区拼花数据中读取DateType列时出错

提问于
浏览
4

我在S3中使用nyc_date以 s3://mybucket/mykey/nyc_date=Y-m-d/*.gz.parquet 格式分区的镶木地板数据 .

我有一个DateType列 event_date ,当我尝试从S3读取并使用EMR写入hdfs时,由于某种原因抛出此错误 .

from pyspark.sql import SparkSession

spark = SparkSession.builder.enableHiveSupport().getOrCreate()
df = spark.read.parquet('s3a://mybucket/mykey/') 

df.limit(100).write.parquet('hdfs:///output/', compression='gzip')

错误:

java.lang.UnsupportedOperationException: org.apache.parquet.column.values.dictionary.PlainValuesDictionary$PlainBinaryDictionary
    at org.apache.parquet.column.Dictionary.decodeToInt(Dictionary.java:48)
    at org.apache.spark.sql.execution.vectorized.OnHeapColumnVector.getInt(OnHeapColumnVector.java:233)
    at org.apache.spark.sql.catalyst.expressions.GeneratedClass$GeneratedIterator.processNext(Unknown Source)
    at org.apache.spark.sql.execution.BufferedRowIterator.hasNext(BufferedRowIterator.java:43)
    at org.apache.spark.sql.execution.WholeStageCodegenExec$$anonfun$8$$anon$1.hasNext(WholeStageCodegenExec.scala:370)
    at scala.collection.Iterator$$anon$10.hasNext(Iterator.scala:389)
    at scala.collection.Iterator$$anon$11.hasNext(Iterator.scala:408)
    at org.apache.spark.shuffle.sort.BypassMergeSortShuffleWriter.write(BypassMergeSortShuffleWriter.java:125)
    at org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:79)
    at org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:47)
    at org.apache.spark.scheduler.Task.run(Task.scala:86)
    at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:274)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

这是我想出的:

  • Local works :-) :我以相同的格式在本地复制了一些数据,可以查询 .

  • Avoid selecting event_date works :-) :选择所有50列,但 event_date 不会导致任何错误 .

  • Explicit read path throws error :-( :将读取路径更改为 's3a://mybucket/mykey/*/*.gz.parquet' 仍然会引发错误 .

  • Specifying schema still throws error :-( :在加载前指定架构仍会导致相同的错误 .

  • 我可以将包括eastern_date在内的数据加载到数据仓库中:-) .

真的很奇怪,这只会导致DateType列的错误 . 我没有任何其他DateType列 .

使用Spark 2.0.2和EMR 5.2.0 .

2 回答

  • 0

    我在编写镶木地板时只使用了StringType而不是DateType . 不再有问题了 .

  • 1

    我知道我迟到了...

    我有一个类似的问题 . 我读了好几个镶木地板,合并了它们,并试图写 .

    我的修复是在写入之前添加.select(...) .

相关问题