如何在pysparkDataframe中将列转换为行?

ykejflvf  于 2021-07-14  发布在  Spark
关注(0)|答案(1)|浏览(416)

我有个例子

+----+------+------+-------+
| id | val1 | val2 | val3  |
+----+------+------+-------+
|  1 |   a  |   b  |   c   |
|  2 |   d  |   e  |   f   |
|  3 |   g  |   h  |   i   |

我想要这些柱子 val1 , val2 以及 val3 以这种方式换位成行:

+----+------+------+
| id |  key | value|
+----+------+------+
|  1 | val1 |   a  |
|  1 | val2 |   b  |
|  1 | val3 |   c  |
|  2 | val1 |   d  |
|  2 | val2 |   e  |
|  2 | val3 |   f  |
|  3 | val1 |   g  |
|  3 | val2 |   h  |
|  3 | val3 |   i  |

我怎样才能做到这一点?

stszievb

stszievb1#

通过分解一个Map结构,就有可能得到这样的变换。因此,首先将3列转换为一个Map(基于https://stackoverflow.com/a/41291156/4725074)然后爆炸:

from pyspark.sql.functions as F
from itertools import chain

m = F.create_map(list(chain(*(
        (F.lit(c), F.col(c)) for c in df.columns if c in ["val1", "val2", "val3"]))))

df.withColumn('map', m)\
  .select('*', F.explode('map')).drop('map')

重要的是使用 select() 而不是一个 witchColumn() 当分解一个Map列时会生成两个新列, key 以及 value .
结果是将所选列转换为示例中报告的行。

相关问题