Как перенести искру DF с помощью python (PySpark)? - PullRequest
1 голос
/ 04 августа 2020

У меня есть Spark df, как показано ниже:

p   a b c 
p1  2 2 1
p2  4 3 2

Я хочу преобразовать его в формат ниже, используя код PySpark:

p  col1 col2
p1  a     2
p1  b     2
p1  c     1
p2  a     4
p2  b     3
p2  c     2

Как?

1 Ответ

1 голос
/ 04 августа 2020

Попробуйте с функциями arrays_zip and explode.

Example:

df.show()
#+---+---+---+---+
#|  p|  a|  b|  c|
#+---+---+---+---+
#| p1|  2|  2|  1|
#| p2|  4|  3|  2|
#+---+---+---+---+

df.withColumn("arr",explode(arrays_zip(array(lit("a"),lit("b"),lit("c")),array(col("a"),col("b"),col("c"))))).\
select("p","arr.*").\
withColumnRenamed("0","col1").\
withColumnRenamed("1","col2").\
show()

#dynamically getting column names from dataframe
arr=[ lit('{}'.format(d)) for d in df.columns if d !='p']

df.withColumn("arr",explode(arrays_zip(array(arr),array(col("a"),col("b"),col("c"))))).select("p","arr.*").\
withColumnRenamed("0","col1").\
withColumnRenamed("1","col2").\
show()

#+---+----+----+
#|  p|col1|col2|
#+---+----+----+
#| p1|   a|   2|
#| p1|   b|   2|
#| p1|   c|   1|
#| p2|   a|   4|
#| p2|   b|   3|
#| p2|   c|   2|
#+---+----+----+
...