【问题标题】:Return combined Dataset after joinWith in Spark Scala在 Spark Scala 中 joinWith 后返回组合数据集
【发布时间】:2018-12-03 04:43:53
【问题描述】:

鉴于以下两个 Spark Datasetsflightscapitals,在不先转换为 @ 的情况下返回 combined(即“joined”)结果的最有效方法是什么? 987654324@ 或在.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"))

【问题讨论】:

    标签: scala apache-spark dataset


    【解决方案1】:

    有 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|
    +-----------+----------+-------+
    

    【讨论】:

      猜你喜欢
      • 2022-01-25
      • 2020-06-12
      • 1970-01-01
      • 2018-09-17
      • 1970-01-01
      • 2017-05-03
      • 2019-11-01
      • 2015-09-17
      • 1970-01-01
      相关资源
      最近更新 更多