gpt4 book ai didi

scala - 在 spark 数据集中加入两个聚簇表似乎以完全洗牌结束

转载 作者:行者123 更新时间:2023-12-05 06:17:12 27 4
gpt4 key购买 nike

我有两个 Hive 集群表 t1 和 t2

CREATE EXTERNAL TABLE `t1`(
`t1_req_id` string,
...
PARTITIONED BY (`t1_stats_date` string)
CLUSTERED BY (t1_req_id) INTO 1000 BUCKETS
// t2 looks similar with same amount of buckets

插入部分发生在hive中

set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
insert overwrite table `t1` partition(t1_stats_date,t1_stats_hour)
select *
from t1_raw
where t1_stats_date='2020-05-10' and t1_stats_hour='12' AND
t1_req_id is not null

代码如下所示:

 val t1 = spark.table("t1").as[T1]
val t2= spark.table("t2").as[T2]
val outDS = t1.joinWith(t2, t1("t1_req_id) === t2("t2_req_id), "fullouter")
.map { case (t1Obj, t2Obj) =>
val t3:T3 = // do some logic
t3
}
outDS.toDF.write....

我在 DAG 中看到了投影 - 但似乎这项工作仍在进行完整的数据洗牌此外,在查看执行程序的日志时,我没有看到它在一个 block 中读取两个表的同一个桶——这是我期望找到的

spark.sql.sources.bucketing.enabledspark.sessionState.conf.bucketingEnabledspark.sql.join.preferSortMergeJoin 标志

我错过了什么?如果有分桶表,为什么还有完整的洗牌?目前的spark版本是2.3.1

enter image description here enter image description here

最佳答案

这里要检查的一种可能性是类型不匹配。例如。如果连接列的类型在 T1 中是字符串,在 T2 中是 BIGINT。即使类型都是整数(例如一个是 INT,另一个是 BIGINT),Spark 仍然会在这里添加 shuffle,因为不同的类型使用不同的哈希函数进行分桶。

关于scala - 在 spark 数据集中加入两个聚簇表似乎以完全洗牌结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61750844/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com