Spark忽略了Hive表的存储区设置

时间:2018-08-20 07:51:29

标签: apache-spark

我正在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

2 个答案:

答案 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

Spark Bucket vs Hive Bucket