isin()函数

pgpifvop  于 2021-05-27  发布在  Spark
关注(0)|答案(2)|浏览(467)

我有以下两个Dataframe。

dataframe1
┌────────────┬─────────────┬──────────────┐
│idZones     │Longitude    │latitude      |
├────────────┼─────────────┼──────────────┤
|[50,30,10]  |-7.073781666 |33.826661     |
└────────────┴─────────────┴──────────────┘
dataframe2
┌────────────┬─────────────┬──────────────┐
│id          │col1         │col2          │
├────────────┼─────────────┼──────────────┤
│10          │aaaaaaaaaaaa │bb32          │
│90          │ppp          │cc20          │
└────────────┴─────────────┴──────────────┘

我想要以下输出

┌────────────┬─────────────┬──────────────┐
│id          │col1         |col2          │
├────────────┼─────────────┼──────────────┤
│10          │aaaaaaaaaaaa │bb32          │
└────────────┴─────────────┴──────────────┘

我使用以下代码

dataframe1.join(dataframe2,dataframe2.col("id").isin(dataframe1.col("idZones")));

注意idzones列是一个数组[int]
我得到这个错误

cannot resolve '(`id` IN (dataframe1.`idZones`))' due to data type mismatch: Arguments must be same type but were: int != array<int>;;

我需要你的帮助
谢谢您

nukf8bse

nukf8bse1#

正如@rayan所建议的,在将dataframe1与dataframe2连接之前,可以使用explode
创建Dataframe-

val dataframe1 = Seq((Array(50,30,10),-7,30)).toDF("idZones","longitude","latitude")

val dataframe2 = Seq((10,"aaaaa","bb32"),(90,"ppp","cc20")).toDF("id","col1","col2")

爆炸逻辑-

dataframe1.select(explode($"idZones").as("idZones")).join(dataframe2, $"idZones" === dataframe2("id")).show(false)

输出-

+-------+---+-----+----+
|idZones|id |col1 |col2|
+-------+---+-----+----+
|10     |10 |aaaaa|bb32|
+-------+---+-----+----+
w51jfk4q

w51jfk4q2#

尝试替换 isinarray_contains .

dataframe1.join(dataframe2, expr("array_contains(idZones, id)"))

(固定代码,谢谢@shantanu kher)
另一种方式,你可以
explode dataframe1.col("idZones") ,然后进行连接。

相关问题