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

Avi*_*Avi 15 scala apache-spark apache-spark-sql

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

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

D1和D2都具有相同的列.

有人可以帮我这个吗?

我正在使用Spark 1.6.

che*_*aux 44

假设您要加入"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.*")
Run Code Online (Sandbox Code Playgroud)

  • 这是访问DataFrame列的另一种方法,如[here](https://spark.apache.org/docs/1.6.0/api/java/org/apache/spark/sql/Column.html)所述,但是你必须导入implicits包(我编辑了我的答案) (2认同)

nsa*_*lar 8

作为替代答案,您也可以在不添加别名的情况下执行以下操作:

d1.join(d2, d1("id") === d2("id"))
  .select(d1.columns.map(c => d1(c)): _*)
Run Code Online (Sandbox Code Playgroud)


Krz*_*sik 5

您可以使用left_semi

d1.as("d1").join(d2.as("d2"), $"d1.id" === $"d2.id", "left_semi")
Run Code Online (Sandbox Code Playgroud)

半联接仅从满足联接条件的左侧数据集中获取行。

还有另一个有趣的连接类型:left_anti,这相若方式工作,以left_semi但仅当条件的那些行没有满足。