Saya memiliki dataset seperti di bawah ini:

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)

Saya ingin menambahkan kolom ke kerangka data, hasHitSong, yang akan mengulangi urutan lagu hit di bawah col2, periksa apakah ada lagu hit, misalnya. "Hey Jude" dan tandai sebagai 1, jika tidak 0.

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

Apakah ada cara untuk melakukan ini tanpa meledakkan kolom col2 dan hanya mengulangi array bersarang di bawah col2?

0
riyaB 5 Mei 2020, 11:18

1 menjawab

Jawaban Terbaik

Jika Anda menggunakan spark versi 2.4 atau versi yang lebih tinggi:

Menggunakan fungsi bawaan

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

Menggunakan fungsi orde tinggi

df.withColumn("hasHitSongs, expr("exists(col2, a -> exists(a, b -> b = 'hey jude'))"))
2
Belwal 5 Mei 2020, 11:46