Scala Dataframe 仅连接并获取正确的表列

Posted

技术标签:

【中文标题】Scala Dataframe 仅连接并获取正确的表列【英文标题】:Scala Dataframe join and get right table columns only 【发布时间】:2021-06-22 23:07:39 【问题描述】:
import org.apache.spark.sql.functions._
import org.apache.spark.sql.expressions.Window

val df1 = Seq(
  (1,"A") 
  ).toDF("id","value")
df1.show()

val df2 = Seq(
  (1,"C") 
  ).toDF("id","value")
df2.show()

val joinKey = "id"
    
df1.join(df2.as("dfy"),joinKey.split(",").toSeq).show()

   

 Output:
    +---+-----+
    | id|value|
    +---+-----+
    |  1|    A|
    +---+-----+
    
    +---+-----+
    | id|value|
    +---+-----+
    |  1|    C|
    +---+-----+
    
    +---+-----+-----+
    | id|value|value|
    +---+-----+-----+
    |  1|    A|    C|
    +---+-----+-----+

我只想从右表中获取列,包括连接键“id”。但是由于 scala 跳过了重复的列,所以如果我按照下面的操作,这在右表中不可用。

df1.as("dfx").join(df2.as("dfy"),joinKey.split(",").toSeq).select($"dfy.*").show()

+-----+
|value|
+-----+
|    C|
+-----+

这可行,但我不想从右表中获取所有行,因为可能有很多。

 df1.as("dfx").join(df2.as("dfy"),joinKey.split(",").toSeq,"right").select($"dfy.*").show()
+---+-----+
| id|value|
+---+-----+
|  1|    C|
+---+-----+

最好的方法是什么? 谢谢。

【问题讨论】:

【参考方案1】:

由于您真正想要的是内部联接,因此您应该翻转查询并使用 left_semi 联接。

df2.join(df1, joinKey.split(","), "leftsemi").show()

根据您所说的 df2 很大,这甚至应该为您带来性能优势。

【讨论】:

为什么不保留订单并做一个'rightsemi'? Spark 没有 right_semi join 太奇怪了。

以上是关于Scala Dataframe 仅连接并获取正确的表列的主要内容,如果未能解决你的问题,请参考以下文章

在 Spark 中使用 Dataframe 获取平均值

Dataframe Spark Scala中的最后一个聚合函数

仅从 Spark Scala DataFrame 写入标头 CSV 记录

将DataFrame转换为scala中的字符串

从Scala中的任意数据数据获取Spark DataFrame的最简单方法是什么?

Scala Spark-> 从 DataFrame 中选择前 15 列