私は1行と複数の列を持つデータフレームを持っています。一部の列は単一の値であり、他の列はリストです。すべてのリスト列は同じ長さです。リストのない列をそのままにして、各リストの列を別々の行に分割したい。Pyspark:複数の配列列を行に分割する
サンプルDF:私が欲しいもの
df = sqlc.createDataFrame([Row(a=1, b=[1,2,3],c=[7,8,9], d='foo')])
# +---+---------+---------+---+
# | a| b| c| d|
# +---+---------+---------+---+
# | 1|[1, 2, 3]|[7, 8, 9]|foo|
# +---+---------+---------+---+
:
+---+---+----+------+
| a| b| c | d |
+---+---+----+------+
| 1| 1| 7 | foo |
| 1| 2| 8 | foo |
| 1| 3| 9 | foo |
+---+---+----+------+
私は唯一のリスト列を持っていた場合、これはちょうどexplode
を実行して、簡単に次のようになります。
df_exploded = df.withColumn('b', explode('b'))
# >>> df_exploded.show()
# +---+---+---------+---+
# | a| b| c| d|
# +---+---+---------+---+
# | 1| 1|[7, 8, 9]|foo|
# | 1| 2|[7, 8, 9]|foo|
# | 1| 3|[7, 8, 9]|foo|
# +---+---+---------+---+
しかし、私もexplode
のc
列にしようとすると、私はdataf長さ、私が何をしたいの広場でRAME:
df_exploded_again = df_exploded.withColumn('c', explode('c'))
# >>> df_exploded_again.show()
# +---+---+---+---+
# | a| b| c| d|
# +---+---+---+---+
# | 1| 1| 7|foo|
# | 1| 1| 8|foo|
# | 1| 1| 9|foo|
# | 1| 2| 7|foo|
# | 1| 2| 8|foo|
# | 1| 2| 9|foo|
# | 1| 3| 7|foo|
# | 1| 3| 8|foo|
# | 1| 3| 9|foo|
# +---+---+---+---+
私が欲しいものはある - 各列に対して、その列の配列のn番目の要素を取り、新しい行にそれを追加します。私は、データフレーム内のすべての列accross爆発マッピングしようとしたが、それはどちらか動作していないよう:DataFrames
で
df_split = df.rdd.map(lambda col: df.withColumn(col, explode(col))).toDF()