在Spark Scala中的joinWith之后返回组合的数据集

时间:2018-12-02 03:13:27

标签: scala apache-spark dataset

鉴于以下两个Spark Datasetsflightscapitals,最有效的返回 combined (即“ joined”)结果的方法是什么而不先转换为DataFrame或用.select()方法按名称写出所有列?例如,我知道我可以使用(例如.map(x => x._1)访问元组,也可以将*运算符用于:

result.select("_1.*","_2.*")

但是后者可能会导致重复的列名,我希望有一个更干净的解决方案。

谢谢您的帮助。

case class Flights(tripNumber: Int, destination: String)

case class Capitals(state: String, capital: String)

val flights = Seq(
  (55, "New York"),
  (3, "Georgia"),
  (12, "Oregon")
).toDF("tripNumber","destination").as[Flights]

val capitals = Seq(
  ("New York", "Albany"),
  ("Georgia", "Atlanta"),
  ("Oregon", "Salem")
).toDF("state","capital").as[Capitals]

val result = flights.joinWith(capitals,flights.col("destination")===capitals.col("state"))

1 个答案:

答案 0 :(得分:0)

有2个选项,但是您必须使用join而不是joinWith

  1. 这是Dataset API最好的部分,是删除其中一个联接列 ,因此无需在以下选择中重复投影列:val result = flights.join(capitals,flights("destination")===capitals("state")).drop(capitals("state"))
  2. 将两个数据集中的连接列重命名为相同,并使用稍微不同的方式指定连接:val result = flights.join(capitals.withColumnRenamed("state", "destination"), Seq("destination"))

输出:

result.show
+-----------+----------+-------+
|destination|tripNumber|capital|
+-----------+----------+-------+
|   New York|        55| Albany|
|    Georgia|         3|Atlanta|
|     Oregon|        12|  Salem|
+-----------+----------+-------+