使用 Spark Scala 连接两个数据框

Posted

技术标签:

【中文标题】使用 Spark Scala 连接两个数据框【英文标题】:Join two dataframe using Spark Scala 【发布时间】:2020-03-29 13:50:50 【问题描述】:

我有这个代码:

   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】:

您正在为 DataFrame 而不是列别名,后者用于访问/引用该 DataFrame 中的列。 所以第一次连接将导致另一个DataFrame 两次具有相同的列名(origin_latitude 以及origin_longitude)。一旦您尝试访问生成的DataFrame 中的这些列之一,您将收到Ambiguity 错误。

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

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

【讨论】:

以上是关于使用 Spark Scala 连接两个数据框的主要内容,如果未能解决你的问题,请参考以下文章

使用数据框的子集和 spark/scala 中的两个特定字段过滤数据框 [关闭]

在 Spark scala 中更新数据框的最佳方法

Spark SCALA - 连接两个数据帧,其中一个数据帧中的连接值位于第二个数据帧中的两个字段之间

用于大型交叉连接的Spark scala分区数据框

在scala spark中为两个不同的数据框创建视图

Spark 中的数据框比较:Scala