我有两个数据集。
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();
对于每个人的“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”数据帧很小,则可以使用广播连接以获得更好的性能。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。