我正在S3上处理一个1 TB大小的数据集。数据在Parquet文件中。执行以下代码后,每个分区中创建了许多文件,但没有正确的数字(6)。
import org.apache.spark.sql.SaveMode
val dates = List(201208, 201209)
spark.sqlContext.sql("use db")
dates.foreach { date =>
val df = spark
.sqlContext
.sql("select * from db.orig_parquet_0 where departure_date_year_month_int=" + date)
df.write.format("orc")
.option("compression","zlib")
.option("path","s3://s3-bucket/test_orc_opt_1")
.sortBy("departure_date_year", "activity_date_int", "agency_continent")
.partitionBy("departure_date_year_month_int")
.bucketBy(6, "departure_date_year")
.mode(SaveMode.Append)
.saveAsTable("db.test_orc_opt_1");
}
当我尝试从Presto查询时,它会引发以下异常:
Query 20180820_074141_00004_46w5b failed: Hive table 'db.test_orc_opt_1' is corrupt. The number of files in the directory (13) does not match the declared bucket count (6) for partition: departure_date_year_month_int=201208
是否有一种方法可以为Spark强制执行存储桶操作?
Spark版本2.3.1
答案 0 :(得分:0)
尝试更改
.bucketBy(6, "departure_date_year")
到
.bucketBy(13, "departure_date_year")
您使用的是哪个版本的Spark?
答案 1 :(得分:0)
火花存储区与Hive存储区不同。使用配置单元而不是Spark插入表。
请查看第42页,
https://www.slideshare.net/databricks/hive-bucketing-in-apache-spark-with-tejas-patil