在Spark SQL中连接两个DataFrame并仅选择一个列

时间:2016-08-02 13:02:56

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

我在Spark SQL中有两个DataFrame( D1和D2 )。

我正试图加入他们两个D1.join(D2, "some column") 并获取仅D1的数据,而不是完整的数据集

D1和D2都有相同的列。

有人可以帮我这个吗?

我正在使用Spark 1.6。

4 个答案:

答案 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)
相关问题