【问题标题】:Converting 2D Matrix - Dataframe to Flat Table in PySpark在 PySpark 中将 2D 矩阵 - 数据框转换为平面表
【发布时间】:2019-03-29 11:48:18
【问题描述】:

我有一个如下所示的 PySpark 数据框:

  id  header1 header2 header3 ... headerN
  a      997    154.5   0.8        .... 
  b      0.3      3.4   6.7        ....
  c      7        8      9        ....
  .
  .
  .

我想将其转换为如下所示的平面表:

a header1 997
a header2 154.5
a header3 0.8
b header1 0.3
b header2 0.3

等等

每个标题列名称都是唯一的。第一列名称是 ID。如何在 PySpark 中最有效地转换它?我可以循环遍历DataFrame,但必须有更有效的方法。

这是一个示例数据框:

df = spark.createDataFrame([
    ('a',997.0,154.5,0.8),
    ('b',0.3,3.4,6.7),
    ('c',7.0,8.0,9.0)],
    ['id','header1','header2','header3'])

【问题讨论】:

  • 这个问题不是很清楚。您是否希望更改格式或将表格减少到设定的列数?
  • @AlphaTested 我希望更改表格的格式。当前表格是一种二维矩阵。

标签: python apache-spark dataframe pyspark apache-spark-sql


【解决方案1】:

一种方法 -

第一步:使用create_map函数将除id之外的collect列转换为map列;

第二步:explode地图栏;

from pyspark.sql.functions import create_map, lit, explode, col

map_cols = (c for x in df.columns if x != 'id' for c in [lit(x), col(x)])
df.select('id', explode(create_map(*map_cols))).show()
+---+-------+-----+
| id|    key|value|
+---+-------+-----+
|  a|header1|997.0|
|  a|header2|154.5|
|  a|header3|  0.8|
|  b|header1|  0.3|
|  b|header2|  3.4|
|  b|header3|  6.7|
|  c|header1|  7.0|
|  c|header2|  8.0|
|  c|header3|  9.0|
+---+-------+-----+

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-27
    • 1970-01-01
    • 1970-01-01
    • 2020-11-09
    • 2021-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多