Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 在spark数据集中连接两个集群表似乎以完全洗牌结束_Scala_Apache Spark_Apache Spark Dataset - Fatal编程技术网

Scala 在spark数据集中连接两个集群表似乎以完全洗牌结束

Scala 在spark数据集中连接两个集群表似乎以完全洗牌结束,scala,apache-spark,apache-spark-dataset,Scala,Apache Spark,Apache Spark Dataset,我有两个蜂巢群集表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 插入部分发生在配置单元中 set hive.exec.dynamic.partition=t

我有两个蜂巢群集表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
插入部分发生在配置单元中

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中看到了投影,但看起来这项工作仍然在进行完整的数据洗牌 另外,在查看executor的日志时,我没有看到它在一个块中读取两个表的同一个bucket,这是我希望找到的

spark.sql.sources.bucketing.enabled
spark.sessionState.conf.bucketineganabled
spark.sql.join.preferSortMergeJoin
flags

我错过了什么?如果有带扣子的桌子,为什么还有完全的洗牌呢? 目前的spark版本是2.3.1


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

我认为Spark不会利用具有fullouter连接的集群数据。在这里,您要求Spark读取所有数据以执行外部联接,因此Spark知道它应该读取整个数据集,并且没有要应用的筛选器。这张图片与我使用的左联接相同。我不知道为什么这不起作用,以及我需要查看哪些其他配置。为了填充数据,我从配置单元运行了它(插入覆盖表…选择*…)好的,我明白了,很抱歉我没有很好地阅读您的示例。因此,bucketing未被利用的一个可能原因可能是Spark没有保留bucketing期间使用的列的元数据。也许您可以尝试使用数据帧而不是数据集?数据帧具有相同的结果。感觉没有使用配置单元元存储信息。但是如果我运行spark.sql(“show extended t1”).show(numRows=100,truncate=false),我会看到带扣的定义hanks,但事实并非如此。类型完全相同:(描述扩展的
如何描述您的表?它是否看到了bucketing?