输出Hive表已存储分区,但Spark当前不填充与Hive兼容的存储分区输出

时间:2019-12-25 00:20:01

标签: apache-spark hive bucket

我有一个Apache Spark(v2.4.2)数据框,我想将此数据框插入到配置单元表中。

df = spark.sparkContext.parallelize([["c1",21, 3], ["c1",32,4], ["c2",4,40089], ["c2",439,6889]]).toDF(["c", "n", "v"])
df.createOrReplaceTempView("df")

然后我创建了一个配置单元表:

 spark.sql("create table if not exists sample_bucket(n INT, v INT)
 partitioned by (c STRING) CLUSTERED BY(n) INTO 3 BUCKETS")

然后我尝试将数据帧df中的数据插入到sample_bucket表中:

 spark.sql("INSERT OVERWRITE table SAMPLE_BUCKET PARTITION(c)  select n, v, c from df")

哪个给我一个错误,说:

 Output Hive table `default`.`sample_bucket` is bucketed but Spark currently 
 does NOT populate bucketed output which is compatible with Hive.;

我尝试了几种无效的方法,其中一种是:

 spark.sql("set hive.exec.dynamic.partition.mode=nonstrict")
 spark.sql("set hive.enforce.bucketing=true")
 spark.sql("INSERT OVERWRITE table SAMPLE_BUCKET PARTITION(c)  select n, v, c from df cluster by n")

可是没有运气,谁能帮助我!

2 个答案:

答案 0 :(得分:1)

Spark(当前最新的2.4.5)不完全支持Hive存储桶表。 您可以读取存储桶的表(没有任何存储桶的影响)甚至插入其中(在这种情况下,存储桶将被忽略,并且Hive的读取操作可能具有不可预料的行为)。

请参见https://issues.apache.org/jira/browse/SPARK-19256

答案 1 :(得分:-1)

代替使用sparksql上下文,请查看是否可以使用数据框插入持久性配置单元表。下面是相同的示例代码片段,

df = spark.sparkContext.parallelize([["c1",21, 3], ["c1",32,4], ["c2",4,40089], ["c2",439,6889]]).toDF(["c", "n", "v"])
df.createOrReplaceTempView("df")

df.write
  .partitionBy("c")
  .bucketBy(42, "n")
.saveAsTable("SAMPLE_BUCKET")

请检查是否可行。