Spark:读取分区拼花d中的DateType列时出错

2024-05-15 01:05:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我在S3中有拼花数据,由nyc_date以s3://mybucket/mykey/nyc_date=Y-m-d/*.gz.parquet格式分区。

我有一个DateType列event_date,当我试图使用EMR从S3读取和写入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)

我发现:

  • 本地工作:-):我以相同的格式在本地复制了一些数据,可以很好地查询。
  • 避免选择event_date works:-):选择除event_date之外的所有50+列不会导致任何错误。
  • 显式读取路径抛出错误:-(:将读取路径更改为's3a://mybucket/mykey/*/*.gz.parquet'仍抛出错误。
  • 指定架构仍会引发错误:-(:加载前指定架构仍会导致相同的错误。
  • 我可以将包括东方数据在内的数据加载到数据仓库中:-)。

很奇怪,这只会导致DateType列出错。我没有其他日期类型列。

使用Spark 2.0.2和EMR 5.2.0。


Tags: 数据runorgsqldateapache错误java
2条回答

我知道我来晚了。。。

我也有类似的问题。我读了几首拼花曲,把它们结合起来,试着写。

我的解决方法是在写入之前添加一个.select(…)。

我只是在写拼花时用StringType而不是DateType。别再有问题了。

相关问题 更多 >

    热门问题