isin () с использованием Spark / Java - PullRequest
3 голосов
/ 08 июля 2020

У меня есть следующие два фрейма данных.

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>;;

Мне нужна ваша помощь

Спасибо

Ответы [ 2 ]

1 голос
/ 08 июля 2020

Попробуйте заменить isin на array_contains.

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

(фиксированный код, спасибо @Shantanu Kher)

Другой способ, вы можете просто explode dataframe1.col("idZones"), а затем выполните соединение.

0 голосов
/ 08 июля 2020

Как предложил @Rayan, вы можете использовать разнесение перед тем, как присоединить dataframe1 к dataframe2

Создание фреймов данных -

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")

Explosion logi c -

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

Выход -

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