У меня есть DF со столбцами разных временных циклов (1/6, 3/6, 6/6 и т. Д.), И я хотел бы «взорвать» все столбцы, чтобы создать новый DF, в котором каждая строкацикл 1/6.
from pyspark import Row
from pyspark.sql import SparkSession
from pyspark.sql.functions import explode, arrays_zip, col
spark = SparkSession.builder \
.appName('DataFrame') \
.master('local[*]') \
.getOrCreate()
df = spark.createDataFrame([Row(a=1, b=[1, 2, 3, 4, 5, 6], c=[11, 22, 33], d=['foo'])])
| a| b| c| d|
+---+------------------+------------+-----+
| 1|[1, 2, 3, 4, 5, 6]|[11, 22, 33]|[foo]|
+---+------------------+------------+-----+
Я делаю взрыв:
df2 = (df.withColumn("tmp", arrays_zip("b", "c", "d"))
.withColumn("tmp", explode("tmp"))
.select("a", col("tmp.b"), col("tmp.c"), "d"))
Но вывод не тот, что я хочу:
| a| b| c| d|
+---+---+----+-----+
| 1| 1| 11|[foo]|
| 1| 2| 22|[foo]|
| 1| 3| 33|[foo]|
| 1| 4|null|[foo]|
| 1| 5|null|[foo]|
| 1| 6|null|[foo]|
+---+---+----+-----+
Iхотел бы, чтобы это выглядело так:
| a| b| c| d|
+---+---+---+---+
| 1| 1| 11|foo|
| | 2| | |
| | 3| 22| |
| | 4| | |
| | 5| 33| |
| | 6| | |
+---+---+---+---+
Я новичок в Spark, и с самого начала у меня были сложные темы!:)
Обновление 2019-07-15 : Может быть, у кого-то есть решение без использования UDF?-> ответил @ jxc
Обновление 2019-07-17 : Может быть, у кого-то есть решение, как изменить последовательности нулевых <-> значений в более сложном порядке?Как в c
- Null, 11, Null, 22, Null, 33
или более сложной ситуации, как мы хотим, чтобы в столбце d
первое значение было Null
, затем foo
, затем Null, Null, Null
:
| a| b| c| d|
+---+---+---+---+
| 1| 1| | |
| | 2| 11|foo|
| | 3| | |
| | 4| 22| |
| | 5| | |
| | 6| 33| |
+---+---+---+---+