Scala 为什么集群似乎没有';spark余群函数中的t工作

Scala 为什么集群似乎没有';spark余群函数中的t工作,scala,apache-spark,Scala,Apache Spark,我有两个蜂巢群集表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 代码如下所示: val t1 = spark.table("t1").as[T1].

我有两个蜂巢群集表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
代码如下所示:

 val t1 = spark.table("t1").as[T1].rdd.map(v => (v.t1_req_id, v))
 val t2=  spark.table("t2").as[T2].rdd.map(v => (v.t2_req_id, v))

 val outRdd = t1.cogroup(t2)
      .flatMap { coGroupRes =>
        val key = coGroupRes._1
        val value: (Iterable[T1], Iterable[T2])= coGroupRes._2
        val t3List = // create a list with some logic on Iterable[T1] and Iterable[T2]
        t3List
 }
 outRdd.write....
我确保t1和t2表都有相同数量的分区,并且在spark submit上有
spark.sql.sources.bucketing.enabled=true
spark.sessionState.conf.bucketinagenabled=true
标志

但是Spark DAG没有显示集群的任何影响。似乎仍然有数据完全洗牌 我遗漏了什么,其他配置,调音?如何确保没有完整的数据洗牌? 我的spark版本是2.3.1

而且它不应该显示出来

任何逻辑优化都仅限于
DataFrame
API。一旦您将数据推送到黑盒函数数据集API(请参阅)和稍后的RDDAPI,就不会再将更多信息推回到优化器

您可以通过先执行join来部分利用bucketing,在这些行周围获得一些东西

spark.table("t1")
   .join(spark.table("t2"), $"t1.t1_req_id" === $"t2.t2_req_id", "outer")
   .groupBy($"t1.v.t1_req_id", $"t2.t2_req_id")
   .agg(...) // For example collect_set($"t1.v"), collect_set($"t2.v")

但是,与cogroup不同,这将在组内生成完整的笛卡尔积,并且可能不适用于您的情况

非常感谢您的解释。我转向rdd的原因是我需要在同一个键上连接5个表-每个表中的事件量不同,并且基于事件数据创建一些元计数器。这是一种概念映射reduce,但我希望通过准备集群输入来避免完全洗牌。