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 仅连接并获取正确的表列的主要内容,如果未能解决你的问题,请参考以下文章
Dataframe Spark Scala中的最后一个聚合函数
仅从 Spark Scala DataFrame 写入标头 CSV 记录