apache-spark - Pyspark从列表中添加一列重复值
问题描述
我有一个 pyspark 数据框,并且想要添加一个列,该列以重复的方式从列表中添加值。如果这只是 python,我可能会使用 itertools 的循环功能。我不知道如何在 pyspark 中执行此操作。
names = ['Julia', 'Tim', 'Zoe']
我的数据框如下所示:
+-----+------+
| id_A| idx_B|
+-----+------+
| a| 0|
| b| 0|
| b| 2|
| b| 2|
| b| 2|
| b| 2|
+-----+------+
我希望它看起来像这样:
+-----+------+--------+
| id_A| idx_B| names |
+-----+------+--------+
| a| 0| Julia|
| b| 0| Tim|
| b| 2| Zoe|
| b| 2| Julia|
| b| 2| Tim|
| b| 2| Zoe|
+-----+------+--------+
解决方案
这是一种方法。
1 - 为您的数据框添加一个唯一的增量 ID:
df = spark.createDataFrame(
df.rdd.zipWithIndex().map(lambda x: Row(*x[0], x[1]))
).toDF("id_A", "idx_B", "id")
df.show()
#+----+-----+---+
#|id_A|idx_B| id|
#+----+-----+---+
#| a| 0| 0|
#| b| 0| 1|
#| b| 2| 2|
#| b| 2| 3|
#| b| 2| 4|
#| b| 2| 5|
#+----+-----+---+
2 - 从名称列表中创建数据框:
names_df = spark.createDataFrame([(idx, name) for idx, name in enumerate(names)], ["name_id", "names"])
3 - 在条件下使用模 3(名称列表的长度)加入:
from pyspark.sql import functions as F
result = df.join(
names_df,
F.col("id") % 3 == F.col("name_id")
).orderBy("id").drop("id", "name_id")
result.show()
#+----+-----+-----+
#|id_A|idx_B|names|
#+----+-----+-----+
#| a| 0|Julia|
#| b| 0| Tim|
#| b| 2| Zoe|
#| b| 2|Julia|
#| b| 2| Tim|
#| b| 2| Zoe|
#+----+-----+-----+
推荐阅读
- python - pandas.read_table 在 Jupyter 笔记本中工作,但在 vi 编辑器中不起作用
- r - 使用 While 和 For 循环在 R 中分配新变量
- logging - 如何使用同一 pod 中的另一个容器从容器中读取标准输出
- html - 如何根据浏览器大小调整图像大小?
- java - 无法使用 Selenium 启动 Chrome 浏览器
- asp.net-mvc - 如何在 ASP.NET MVC 中使用前进和后退功能从数据库中检索视频
- python - 如何获得具有指定条件的数据框的总和?
- node.js - 将版本化的 API 路由动态加载到 express.Router
- firefox-addon - 开发插件/扩展来查看 PDF
- testing - 嵌入式系统 HMI 测试的机器人框架支持