Spark: проверьте, существует ли значение во вложенном массиве без разрыва - PullRequest
0 голосов
/ 05 мая 2020

У меня есть набор данных, как показано ниже:

val df = Seq(("beatles", Seq(Seq("help", "hey jude"))), 
            ("romeo", Seq(Seq("help2", "hey judge"),Seq("help3", "they judge")))).toDF("col1", "col2")

root
 |-- col1: string (nullable = true)
 |-- col2: array (nullable = true)
 |    |-- element: array (containsNull = true)
 |    |    |-- element: string (containsNull = true)

Я хочу добавить столбец в фрейм данных, hasHitSong, который будет повторять последовательность хитовых песен в col2, проверьте, существует ли хитовая песня, например, для «Привет, Джуд» и отметьте его как 1, иначе 0.

| col1    | col2                                            | hasHitSongs |
|---------|-------------------------------------------------|-------------|
| beatles | ["help", "hey jude"]                            | 1           |
| romeo   | [["help2", "hey judge"],["help3", "hey judge"]] | 0           |

Есть ли способ сделать это, не взрывая столбец col2 и просто повторяя вложенные массивы в столбце col2?

1 Ответ

2 голосов
/ 05 мая 2020

Если вы используете Spark версии 2.4 или более поздней версии:

Использование встроенной функции

df.withColumn("hasHitSongs", array_contains(flatten(col("col2")), "hey jude"))

Использование функции более высокого порядка

df.withColumn("hasHitSongs, expr("exists(col2, a -> exists(a, b -> b = 'hey jude'))"))
...