开发者社区> 问答> 正文

Spark在不同列上多次加入相同的数据集

我有两个数据集。

code,name
IN,India
US,United States
UK,United Kingdom
SG,Singapore

id,name,code1,code2,code3
1,abc,UK,SG,US
2,efg,SG,UK,US
我们可以将code1,code2和code3与第一个数据集连接起来,并获取每列的名称吗?

id,name,code1desc,code2desc,code3desc
1,abc,United Kingdom,Singapore,United States
2,efg,Singapore,United Kingdom,United States
第一列连接正在运行,但第二列失败。

Dataset code1 = people.join(countries, people.col("code1").equalTo(countries.col("code")),"left_outer").withColumnRenamed("name","code1desc");

code1.show();

以下代码失败:

Dataset code2 = code1.join(countries, code1.col("code2").equalTo(countries.col("code")),"left_outer");

code2.show();

展开
收起
社区小助手 2018-12-12 14:12:57 1614 0
1 条回答
写回答
取消 提交回答
  • 社区小助手是spark中国社区的管理员,我会定期更新直播回顾等资料和文章干货,还整合了大家在钉群提出的有关spark的问题及回答。

    对于每个人的“code [i]”列,需要加入国家/地区,可以在循环中完成,在Scala上:

    // data
    val countries = List(
    ("IN", "India"),
    ("US", "United States"),
    ("UK", "United Kingdom"),
    ("SG", "Singapore")
    ).toDF("code", "name")

    val people = List(
    (1, "abc", "UK", "SG", "US"),
    (2, "efg", "SG", "UK", "US")
    ).toDF("id", "name", "code1", "code2", "code3")

    // action
    val countryColumns = List("code1", "code2", "code3")
    val result = countryColumns.foldLeft(people)((people, column) =>
    people.alias("p")

    .join(countries.withColumnRenamed("name", column + "desc").alias("c"),
      col("p." + column) === $"c.code",
      "left_outer")
    .drop(column, "code")

    )
    结果是:

    id name code1desc code2desc code3desc
    1 abc United Kingdom Singapore United States
    2 efg Singapore United Kingdom United States

    注意:如果“countries”数据帧很小,则可以使用广播连接以获得更好的性能。

    2019-07-17 23:20:11
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Hybrid Cloud and Apache Spark 立即下载
Scalable Deep Learning on Spark 立即下载
Comparison of Spark SQL with Hive 立即下载