【发布时间】:2021-05-03 03:06:38
【问题描述】:
这是一个小测试用例,用于重现我在代码中加入时看到的问题
case class B(val b1:String, val b2: Int)
val B1 = new B("One",1)
val B2 = new B("Two",2)
val dsB = spark.createDataset(Seq(B1, B2))
dsB.show()
+---+---+
| b1| b2|
+---+---+
|One| 1|
|Two| 2|
+---+---+
val m = Map(1->"Van")
val mapget = spark.udf.register("mapget", (b: Int) => m.get(b))
val dsB1 = dsB.withColumn("b2", mapget(dsB("b2"))).where("b2 is not null")
dsB1.show()
+---+---+
| b1| b2|
+---+---+
|One|Van|
+---+---+
val j = dsB1.joinWith(dsB, dsB1("b1") === dsB("b1"), "inner")
j.show()
+----------+--------+
| _1| _2|
+----------+--------+
|[One, Van]|[One, 1]|
|[One, Van]|[Two, 2]|
+----------+--------+
joinWith 结果不正确。它本质上是在做一个交叉产品。任何线索是什么问题?我已经验证join API 工作正常。
val j = dsB1.join(dsB, dsB1("b1") === dsB("b1"), "inner")
j.show()
+---+---+---+---+
| b1| b2| b1| b2|
+---+---+---+---+
|One|Van|One| 1|
+---+---+---+---+
【问题讨论】:
-
我也收到了@Grisha_WeinTraub 提到的错误。如果您将内部联接更改为交叉,则它可以工作并给出您显示的输出。
标签: scala apache-spark apache-spark-sql apache-spark-dataset