java dataset join_spark dataset 相同列名 join

具有部分相同、部分不同列名的两个Dataset按照部分相同、部分不同列相等进行join操作,有以下几种方式:

val df1 = Seq((1, 2, 3),(1, 1, 1)).toDF("a", "b", "c")

val df2 = Seq((1, 2, 4),(2, 2, 2)).toDF("a", "b1", "d")

df1.show

+---+---+---+

| a| b| c|

+---+---+---+

| 1| 2| 3|

| 1| 1| 1|

+---+---+---+

df2.show

+---+---+---+

| a| b1| d|

+---+---+---+

| 1| 2| 4|

| 2| 2| 2|

+---+---+---+

//join条件:df1("a") == df2("a") && df1("b") == df2("b1")

//若是直接join会报错:org.apache.spark.sql.AnalysisException: Reference 'a' is ambiguous, could be:...

df1.join(df2, col("a") === col("a") && col("b") === col("b1"), "outer").show

//可以改为这样:

df1.join(df2, df1("a") === df2("a") && col("b") === col("b1"), "outer").show

+----+----+----+----+----+----+

| a| b| c| a| b1| d|

+----+----+----+----+----+----+

|null|null|null| 2| 2| 2|

| 1| 2| 3| 1| 2| 4|

| 1| 1| 1|null|null|null|

+----+----+----+----+----+----+

//当然也可以将其中一个Dataset的列改名,改为都相同或都不同,再用上面的方法join

df1.join(df2.withColumnRenamed("b1", "b"), Seq("a", "b"), "outer").show

+---+---+----+----+

| a| b| c| d|

+---+---+----+----+

| 2| 2|null| 2|

| 1| 2| 3| 4|

| 1| 1| 1|null|

+---+---+----+----+

//还可以用Dataset的as方法(与alias方法等效),给Dataset命名,然后消除歧义。(Dataset的别名类似SQL中表的别名)

df1.alias("df1")

.join(df2.as("df2"), col("df1.a") === col("df2.a") && col("b") === col("b1"), "outer")

.show

+----+----+----+----+----+----+

| a| b| c| a| b1| d|

+----+----+----+----+----+----+

|null|null|null| 2| 2| 2|

| 1| 2| 3| 1| 2| 4|

| 1| 1| 1|null|null|null|

+----+----+----+----+----+----+

//如果只想保留df2的a列:

val t = df1.alias("df1")

.join(df2.as("df2"), col("df1.a") === col("df2.a") && col("b") === col("b1"), "outer")

.drop(col("df1.a")).show

+----+----+----+----+----+

| b| c| a| b1| d|

+----+----+----+----+----+

|null|null| 2| 2| 2|

| 2| 3| 1| 2| 4|

| 1| 1|null|null|null|

+----+----+----+----+----+

补充:

Dataset的as方法(与alias方法等效):为Dataset对象起别名,Dataset的别名类似SQL中表的别名。

val df = Seq((1, 2),(1, 1)).toDF("a", "b")

df.select("a").show

+---+

| a|

+---+

| 1|

| 1|

+---+

df.select("df.a").show

//报错:org.apache.spark.sql.AnalysisException: cannot resolve '`df.a`' given input columns: [a, b];

df.as("df").select("df.a").show

+---+

| a|

+---+

| 1|

| 1|

+---+

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值