isin() 函数使用 Spark / Java
isin() function using Spark / Java
我有以下两个数据框。
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>;;
我需要你的帮助
谢谢
尝试将 isin
替换为 array_contains
。
dataframe1.join(dataframe2, expr("array_contains(idZones, id)"))
(固定代码,感谢@Shantanu Kher)
另一种方法,您可以 explode
dataframe1.col("idZones")
,然后进行连接。
正如@Rayan 所建议的,您可以在将 dataframe1 与 dataframe2 连接之前使用 explode
正在创建数据框 -
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|
+-------+---+-----+----+
我有以下两个数据框。
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>;;
我需要你的帮助
谢谢
尝试将 isin
替换为 array_contains
。
dataframe1.join(dataframe2, expr("array_contains(idZones, id)"))
(固定代码,感谢@Shantanu Kher)
另一种方法,您可以 explode
dataframe1.col("idZones")
,然后进行连接。
正如@Rayan 所建议的,您可以在将 dataframe1 与 dataframe2 连接之前使用 explode
正在创建数据框 -
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|
+-------+---+-----+----+