pyspark中的爆炸功能
explode function in pyspark
我的数据框看起来像 -
+----+----+-------------+
|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中的explode函数解决
因为你有 nested array
我们需要 flatten nested arrays
通过先在内置函数中使用 flatten 然后使用 explode函数。
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()
我的数据框看起来像 -
+----+----+-------------+
|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中的explode函数解决
因为你有 nested array
我们需要 flatten nested arrays
通过先在内置函数中使用 flatten 然后使用 explode函数。
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()