首页 > 解决方案 > pyspark 用空索引添加 0

问题描述

我有如下数据框:

+--------+---------+---------+
|  name  |  index  |  score  |  
+--------+---------+---------+
|  name0 |       0 |      50 |
|  name0 |       2 |      90 |
|  name0 |       3 |     100 |
|  name0 |       5 |      85 |
|  name1 |       1 |      65 |
|  name1 |       2 |      50 |
|  name1 |       3 |      70 |
+--------+---------+---------+

并且索引应该是0~5,所以我想要得到的是:

+--------+---------+---------+
|  name  |  index  |  score  |  
+--------+---------+---------+
|  name0 |       0 |      50 |
|  name0 |       1 |       0 |
|  name0 |       2 |      90 |
|  name0 |       3 |     100 |
|  name0 |       4 |       0 |
|  name0 |       5 |      85 |
|  name1 |       0 |       0 |
|  name1 |       1 |      65 |
|  name1 |       2 |      50 |
|  name1 |       3 |      70 |
|  name1 |       4 |       0 |
|  name1 |       5 |       0 |
+--------+---------+---------+

我想在空索引中填充 0,但我不知道。
有什么解决办法吗?请考虑我不使用熊猫。

标签: dataframeapache-sparkpysparkapache-spark-sql

解决方案


使用一系列索引交叉连接名称,然后使用名称和索引左连接到原始数据框,并将空值替换为 0。

spark.conf.set("spark.sql.crossJoin.enabled", True)

df2 = (df.select('name')
         .distinct()
         .join(spark.range(6).toDF('index'))
         .join(df, ['name', 'index'], 'left')
         .fillna({'score': 0})
      )

df2.show()
+-----+-----+-----+
| name|index|score|
+-----+-----+-----+
|name0|    0|   50|
|name0|    1|    0|
|name0|    2|   90|
|name0|    3|  100|
|name0|    4|    0|
|name0|    5|   85|
|name1|    0|    0|
|name1|    1|   65|
|name1|    2|   50|
|name1|    3|   70|
|name1|    4|    0|
|name1|    5|    0|
+-----+-----+-----+

推荐阅读