arrays - Pyspark数据框:计算数组或列表中的元素
问题描述
让我们假设数据框df
为:
df.show()
输出:
+------+----------------+
|letter| list_of_numbers|
+------+----------------+
| A| [3, 1, 2, 3]|
| B| [1, 2, 1, 1]|
+------+----------------+
我想要做的是对count
column 中的特定元素进行编号list_of_numbers
。像这样的东西:
+------+----------------+----+
|letter| list_of_numbers|ones|
+------+----------------+----+
| A| [3, 1, 2, 3]| 1|
| B| [1, 2, 1, 1]| 3|
+------+----------------+----+
到目前为止,我已经尝试过创建udf
并且效果很好,但我想知道是否可以在不定义任何udf
.
解决方案
您可以分解数组并过滤1
. 然后groupBy
和count
:
from pyspark.sql.functions import col, count, explode
df.select("*", explode("list_of_numbers").alias("exploded"))\
.where(col("exploded") == 1)\
.groupBy("letter", "list_of_numbers")\
.agg(count("exploded").alias("ones"))\
.show()
#+------+---------------+----+
#|letter|list_of_numbers|ones|
#+------+---------------+----+
#| A| [3, 1, 2, 3]| 1|
#| B| [1, 2, 1, 1]| 3|
#+------+---------------+----+
为了保留所有行,即使计数为 0,也可以将exploded
列转换为指示变量。然后groupBy
和sum
。
from pyspark.sql.functions import col, count, explode, sum as sum_
df.select("*", explode("list_of_numbers").alias("exploded"))\
.withColumn("exploded", (col("exploded") == 1).cast("int"))\
.groupBy("letter", "list_of_numbers")\
.agg(sum_("exploded").alias("ones"))\
.show()
请注意,我已导入pyspark.sql.functions.sum
以sum_
不覆盖内置sum
函数。
推荐阅读
- java - 使用 Java 读取日志并在 Web 浏览器上显示它们
- java - 线程不能同时在同一个套接字上读写流?
- c# - 通过 JSON 发送的 DateTime 在 Azure 应用服务上减去一天
- keras - 'import keras.layers' 给出 No module named keras 错误,但如果它在 cmd 中运行就很好
- python - 扁平化字典
- electron - 在电子中使用foreverjs会导致电子应用程序在dock中重复
- r - R tmap tm_facet 将值分配给错误的位置
- c - 如何在 C 中将正式的 if 语句包含到参数中?
- python - 如何在 Python 中创建具有随机数的随机整数的列表
- javascript - 如何在 Vue.js 中选择对象类型