使用 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 中的两个特定字段过滤数据框 [关闭]