Join 针对其他数据帧高效地获取数据帧的连接数据和未连接数据

Join 针对其他数据帧高效地获取数据帧的连接数据和未连接数据,join,apache-spark,apache-spark-sql,rdd,spark-dataframe,Join,Apache Spark,Apache Spark Sql,Rdd,Spark Dataframe,我有两个数据帧,比如A和B,它们有不同的模式 我想从数据帧A中获取记录,它在一个键上与B连接,而没有连接的记录,我也想要这些 这可以在单个查询中完成吗? 因为对同一数据进行两次检查会降低性能。数据帧A的大小比B大得多。 数据帧B的大小约为50Gb-100gb。 因此,在这种情况下,我不能广播B 我可以得到一个单独的数据帧C,它可以有一个分区列“Joined”,值为“Yes”或“No”,表示a中的数据是否与B连接 万一A有重复的怎么办?我不想要他们。 我在想我以后会在C数据帧上做一个Debykey

我有两个数据帧,比如A和B,它们有不同的模式

我想从数据帧A中获取记录,它在一个键上与B连接,而没有连接的记录,我也想要这些

这可以在单个查询中完成吗? 因为对同一数据进行两次检查会降低性能。数据帧A的大小比B大得多。 数据帧B的大小约为50Gb-100gb。 因此,在这种情况下,我不能广播B

我可以得到一个单独的数据帧C,它可以有一个分区列“Joined”,值为“Yes”或“No”,表示a中的数据是否与B连接

万一A有重复的怎么办?我不想要他们。 我在想我以后会在C数据帧上做一个Debykey。有什么建议吗

我使用配置单元表在HDFS上以ORC文件格式存储数据。
在scala中编写代码。

是的,您只需要执行左外连接:

import sqlContext.implicits._

val A = sc.parallelize(List(("id1", 1234),("id1", 1234),("id3", 5678))).toDF("id1", "number")
val B = sc.parallelize(List(("id1", "Hello"),("id2", "world"))).toDF("id2", "text")

val joined = udf((id: String) => id match {
  case null => "No"
  case _ => "Yes"
})

val C = A
  .distinct
  .join(B, 'id1 === 'id2, "left_outer")
  .withColumn("joined",joined('id2))
  .drop('id2)
  .drop('text)
这将生成一个数据帧
C:[id1:string,number:int,joined:string]
如下所示:

[id1,1234,Yes]
[id3,5678,No]
请注意,我添加了一个
distinct
,以过滤
a
中的重复项,并且
C
中的最后一列表示是否加入了

编辑:在OP的评论之后,我添加了
drop
行以删除B中的列


是的,您只需要执行左外连接:

import sqlContext.implicits._

val A = sc.parallelize(List(("id1", 1234),("id1", 1234),("id3", 5678))).toDF("id1", "number")
val B = sc.parallelize(List(("id1", "Hello"),("id2", "world"))).toDF("id2", "text")

val joined = udf((id: String) => id match {
  case null => "No"
  case _ => "Yes"
})

val C = A
  .distinct
  .join(B, 'id1 === 'id2, "left_outer")
  .withColumn("joined",joined('id2))
  .drop('id2)
  .drop('text)
这将生成一个数据帧
C:[id1:string,number:int,joined:string]
如下所示:

[id1,1234,Yes]
[id3,5678,No]
请注意,我添加了一个
distinct
,以过滤
a
中的重复项,并且
C
中的最后一列表示是否加入了

编辑:在OP的评论之后,我添加了
drop
行以删除B中的列


我只想从数据帧A中获取记录,其中数据帧A在一个键上与B连接,而未连接的记录,我也需要这些记录(这些是数据帧A本身的记录)。我只想要A中的行,而不是B中的行。我想要A中与B连接的行和未与B连接的行,如果它们与B匹配或不匹配,则用列标记。我只想要从数据帧A中获取记录,该数据帧A在键上与B连接,而未连接的记录,我也想要这些记录(这些是数据帧A本身的记录)。我只想要A中的行,而不是B中的行。我想要A中与B连接的行和未与B连接的行,如果它们与B匹配或不匹配,则用列标记。我不需要B中的列。我感兴趣的模式是A的模式“连接”就是这样。@grv如果我的答案是你想要的,你能把它标记为接受答案吗?否则,请澄清您对答案的任何问题。我还需要一个帮助。如果我希望表A中的记录基于键不在表B中,该怎么办。另一种看它的方式是键上的except子句,而不是整个记录。我不需要B中的列。我感兴趣的模式是a的模式,“joined”就是它。@grv如果我的答案是您要找的,请您将它标记为已接受的答案好吗?否则,请澄清您对答案的任何问题。我还需要一个帮助。如果我希望表A中的记录基于键不在表B中,该怎么办。另一种看待它的方式是键上的except子句,而不是整个记录。