apache-spark - 输出 Hive 表是分桶的,但 Spark 目前不填充与 Hive 兼容的分桶输出

标签 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")

但是没有运气,任何人都可以帮助我!

最佳答案

Spark(当前最后一个 2.4.5)不完全支持 Hive 分桶表。 您可以读取分桶表(没有任何分桶效应),甚至可以将其插入其中(在这种情况下,分桶将被忽略,进一步的 Hive 读取可能会出现无法预料的行为)。

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

关于apache-spark - 输出 Hive 表是分桶的,但 Spark 目前不填充与 Hive 兼容的分桶输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59474331/

相关文章:

jdbc - Hue Hive——Beeswax 服务器找不到 MySQL 的 JDBC 驱动程序

hadoop - Hive:从现有分区表创建新表

sql - 如何在 hive 中获取字符串中的元素?

security - 每个存储桶的 Amazon S3 安全凭证

kubernetes - gcsfuse 在 GKE 和/或 python3 boto 中安装存储桶以进行流式写入?

mongodb - 如何对来自先前 $group 的多个集合进行 $bucket

java - Cassandra 表分析方法?

hadoop - Hivecontext.sql 返回空结果 spark

java - 缩放基于 Java 的树

scala - Spark 中的循环分区是如何工作的?