python - Pyspark 爆炸列表创建列与列表中的索引
问题描述
所以我有一个关于pyspark的问题。我有一个看起来像这样的数据框:
+---+------------+
| id| list|
+---+------------+
| 2|[3, 5, 4, 2]|
+---+------------+
| 3|[4, 5, 3, 2]|
+---+------------+
我想将lists
它分解成多行,并将列表中每个元素的位置信息保存在单独的列中。结果应如下所示:
+---+------------+------------+
| id| listitem| rank|
+---+------------+------------+
| 2| 3| 1|
+---+------------+------------+
| 2| 5| 2|
+---+------------+------------+
| 2| 4| 3|
+---+------------+------------+
| 2| 2| 4|
+---+------------+------------+
| 3| 4| 1|
+---+------------+------------+
| 3| 5| 2|
+---+------------+------------+
| 3| 3| 3|
+---+------------+------------+
| 3| 2| 4|
+---+------------+------------+
rank 列具有每个元素在列表中的位置的索引+1。关于实现它的最佳代码的任何建议?
解决方案
您可以使用posexplode()或posexplode_outer()函数来获得所需的结果。
df = spark.createDataFrame([(2, [3, 5, 4, 2]), (3, [4, 5, 3, 2])], ["id", "list"])
df.select('id',posexplode_outer('list').alias('rank', 'listitem')) \
.withColumn('rank', col('rank') + 1).show()
+---+----+--------+
| id|rank|listitem|
+---+----+--------+
| 2| 1| 3|
| 2| 2| 5|
| 2| 3| 4|
| 2| 4| 2|
| 3| 1| 4|
| 3| 2| 5|
| 3| 3| 3|
| 3| 4| 2|
+---+----+--------+
推荐阅读
- xml - Matlab 并行参数化单元测试未记录 JUnit XML 编写器所需的错误数据
- javascript - 对于 Express 中的 POST 请求,Req.body 为空
- c# - WPF 无法将 tabitem 标题定位到左侧
- node.js - npm install -g @vue/cli VUE CLI安装错误
- python - 如何使用 miniconda 在 Windows 10 上安装 aiohttp?
- python - 将 IF 与 AND/OR python 结合
- arrays - Angular 构造函数中关于带有 colDefs 和 rowData 的 JSON 数组的错误
- python - 使用 snscrape 获取“无法找到访客令牌”错误
- python - 这与下一次之间的天数列值为 True?
- python-3.x - 使用 Python 模块 xml.etree.ElementTree 解析有点复杂的 XML 并将值存储在列表中