spark.sql.Ana: Found conflicting attributes ID#6709708L in the condition joining outer plan

spark-sql执行异常: 信息如下:
org.apache.spark.sql.AnalysisException: Found conflicting attributes ID#6709708L in the condition joining outer plan
不确定是不是因为sparksql的某些写法引起的,临时解决方案是将该字段重命名。

从报错信息来看,应该是join时报错了。

//java版本:
Dataset<Row> biaoA = spark.table(表A);
Dataset<Row> biaoB = spark.table(表B);
Dataset<Row> biaoC = biaoA.join(biaoB,"订单号");
//如果有多个字段关联
List<String> tmpList = new ArrayList<>();
tmpList.add("订单号");
tmpList.add("日期");
Seq<String> tmpSeq = JavaConverters.asScalaIteratorConverter(tmpList.iterator()).asScala().toSeq();
Dataset<Row> biaoC = biaoA.join(biaoB,tmpSeq);

//scala版本:
val c = biaoA.join(biaoB , "订单号")
val c = biaoA.join(biaoB , Seq("订单号"))

//python版本:
c = biaoA.join(biaoB , ["订单号","日期"])
c = biaoA.join(biaoB , "订单号")

参考:https://www.likecs.com/show-205043150.html

  • 这篇博客: Spark SQL 优化笔记中的 3、大表join小表 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 策略:将小表广播(broadcast)
    参数:spark.sql.autoBroadcastJoinThreshold 默认值10485760(10M),当小表或df的大小小于此值,Spark会自动的将该表广播到每个节点上
    原理:join是个shuffle类算子,shuffle时,各个节点上会先将相同的key写到本地磁盘,之后再通过网络传输从其他节点的磁盘文件在拉取相同的key,因此shuffle可能会发生大量的磁盘IO和网络传输,性能很低,而broadcast先将小表广播到每个节点,这样join时都是在本地完成,不需要网络传输,所以会提升性能

    • 注意:broadcast join 也称为replicated join 或者 map-side join