взорвать функцию в pyspark - PullRequest
1 голос
/ 15 марта 2020

Мой фрейм данных выглядит как -

+----+----+-------------+
|col1|col2|         col3|
+----+----+-------------+
|   1|   A|[[[1, 2, 3]]]|
|   2|   B|   [[[3, 5]]]|
+----+----+-------------+

Я хочу фрейм данных -

+----+----+----+
|col1|col2|col3|
+----+----+----+
|   1|   A|   1|
|   1|   A|   2|
|   1|   A|   3|
|   2|   B|   3|
|   2|   B|   5|
+----+----+----+

Мой код похож на -

from pyspark.sql.functions import explode
df = spark.createDataFrame([(1, "A", [[[1,2,3]]]), (2, "B", [[[3,5]]])],["col1", "col2", "col3"])
df1 = df.withColumn("col3", explode(df.col3))
df1.show()

Но вывод -

+----+----+-----------+
|col1|col2|       col3|
+----+----+-----------+
|   1|   A|[[1, 2, 3]]|
|   2|   B|   [[3, 5]]|
+----+----+-----------+

Как решить эту проблему, используя функцию взрыва в pyspark

1 Ответ

0 голосов
/ 15 марта 2020

Поскольку у вас nested array, нам нужно flatten nested arrays, используя flatten во встроенной функции, а затем используйте explode function.

Try with:

from pyspark.sql.functions import *
df.withColumn("col3",explode(flatten(flatten(col("col3"))))).show()
#+----+----+----+
#|col1|col2|col3|
#+----+----+----+
#|   1|   A|   1|
#|   1|   A|   2|
#|   1|   A|   3|
#|   2|   B|   3|
#|   2|   B|   5|
#+----+----+----+

Другим способом было бы пройти через nested array[0][0] и сделать explode на самом внутреннем массиве, как указано в комментарии jxc.

df.withColumn("col3", explode(col("col3")[0][0])).show()
...