我在Spark SQL中有两个DataFrame( D1和D2 )。
我正试图加入他们两个D1.join(D2, "some column")
并获取仅D1的数据,而不是完整的数据集。
D1和D2都有相同的列。
有人可以帮我这个吗?
我正在使用Spark 1.6。
答案 0 :(得分:39)
假设您要加入“id”列。然后你可以写:
val sqlContext = new org.apache.spark.sql.SQLContext(sc)
import sqlContext.implicits._
d1.as("d1").join(d2.as("d2"), $"d1.id" === $"d2.id").select($"d1.*")
答案 1 :(得分:7)
作为替代答案,您还可以在不添加别名的情况下执行以下操作:
d1.join(d2, d1("id") === d2("id"))
.select(d1.columns.map(c => d1(c)): _*)
答案 2 :(得分:1)
您可以使用left_semi
:
d1.as("d1").join(d2.as("d2"), $"d1.id" === $"d2.id", "left_semi")
半连接仅从满足连接条件的左侧数据集中获取列。
答案 3 :(得分:0)
您应该使用 leftsemi 联接,它类似于内部联接的区别,因为leftsemi联接返回左侧数据集中的所有列,而忽略右侧数据集中的所有列。
您可以使用leftsemi联接类型在Scala中尝试以下类似操作Join Spark DataFrame。
empDF.join(deptDF,empDF("emp_dept_id") === deptDF("dept_id"),"leftsemi")
.show(false)
如果您使用的是Python,请使用下面的PySpark join dataframe示例
empDF.join(deptDF,empDF.emp_dept_id == deptDF.dept_id,"leftsemi") \
.show(truncate=False)