如何仅使用数据集API合并两个数据集

时间:2018-06-19 18:48:10

标签: scala apache-spark apache-spark-dataset

我正在努力拼合通过合并其他两个数据集而得到的数据集。 下面是我的代码:

  val family = Seq(
      Person(0, "Agata", 0),
      Person(1, "Iweta", 0),
      Person(2, "Patryk", 2),
      Person(3, "Maksym", 0)).toDS
    val cities = Seq(
      City(0, "Warsaw"),
      City(1, "Washington"),
      City(2, "Sopot")).toDS

然后加入:

val joined = family.joinWith(cities, family("cityId") ===cities("id"),"crossjoin")

获得的结果是:

joined: org.apache.spark.sql.Dataset[(Person, City)]
 _1| _2|

[0,Agata,0]|[0,Warsaw]| | 
[1,Iweta,0]|[0,Warsaw]| |
[2,Patryk,2]| [2,Sopot]| |
[3,Maksym,0]|[0,Warsaw] |

我想弄平它并获得以下数据集:

val output: Dataset= 
[0,Agata,0,Warsaw]|
[1,Iweta,0,Warsaw]|
[2,Patryk,2,Sopot]| 
[3,Maksym,0,Warsaw]

任何不使用dataframe API怎么做的想法,我希望它完全通过Dataset API完成。 非常感谢你的帮助。 最好的问候

2 个答案:

答案 0 :(得分:0)

使用join自身,您将获得相同的输出。

family.join(cities, family("cityId")===cities("id")).drop("id")

示例输出:

+--------+------+--------+
|cityName|cityId|cityName|
+--------+------+--------+
|   Agata|     0|  Warsaw|
|   Iweta|     0|  Warsaw|
|  Patryk|     2|   Sopot|
|  Maksym|     0|  Warsaw|
+--------+------+--------+

答案 1 :(得分:0)

...
val joined = family.join(cities).where(family("cityid") === cities("id")).drop("id") // adding this means use the DF 
joined.show

实验方面意味着尚未正式考虑使用joinWith。

DF和DS彼此接近,所以没关系。我相信实际上不可能实现您想要的一切。

他们也说Dataset [Row]又名DataFrame。