使用Spark Scala连接两个数据框

时间:2020-03-29 13:50:50

标签: scala apache-spark apache-spark-sql

我有此代码:

   val o =    p_value.alias("d1").join(t_d.alias("d2"),
      (col("d1.origin_latitude")===col("d2.origin_latitude")&& 
      col("d1.origin_longitude")===col("d2.origin_longitude")),"left").
      filter(col("d2.origin_longitude").isNull)
   val c =    p_value2.alias("d3").join(o.alias("d4"),
      (col("d3.origin_latitude")===col("d4.origin_latitude") && 
       col("d3.origin_longitude")===col("d4.origin_longitude")),"left").
      filter(col("d3.origin_longitude").isNull)

我收到此错误:

Exception in thread "main" org.apache.spark.sql.AnalysisException: Reference 'd4.origin_latitude' is ambiguous, could be: d4.origin_latitude, d4.origin_latitude.;
at org.apache.spark.sql.catalyst.expressions.package$AttributeSeq.resolve(package.scala:240)
at org.apache.spark.sql.catalyst.plans.logical.LogicalPlan.resolveChildren(LogicalPlan.scala:101)

在此行

 (col("d3.origin_latitude")===col("d4.origin_latitude") && col("d3.origin_longitude")===col("d4.origin_longitude")),"left").

有什么主意吗?

谢谢。

1 个答案:

答案 0 :(得分:1)

您要为DataFrame而不是列添加别名,该别名用于访问/引用该DataFrame中的列。 因此,第一次连接将导致另一个具有相同列名的DataFrame两次(origin_latitudeorigin_longitude)。一旦尝试访问结果DataFrame中的这些列之一,您将得到Ambiguity错误。

因此,您需要确保DataFrame仅包含每个列一次。 您可以按如下所示重写第一个联接:

p_value
      .join(t_d, Seq("origin_latitude", "origin_longitude"), "left")
      .filter(t_d.col("t_d.origin_longitude").isNull)