pyspark - 根据条件从 spark 数据框中删除行
问题描述
我想根据条件从列表的火花数据框中删除行。条件是列表的长度为一定长度。
我尝试将其转换为列表列表,然后使用 for 循环(如下所示),但我希望在 spark 中的一个语句中执行此操作,并根据此条件从原始 df 创建一个新的不可变 df。
newList = df2.values.tolist()
finalList = []
for subList in newList:
if len(subList) < 4:
finalList.append(subList)
因此,例如,如果数据框是单列数据框并且该列被命名为序列,它看起来像:
sequences
____________
[1, 2, 4]
[1, 6, 3]
[9, 1, 4, 6]
我想删除列表长度超过 3 的所有行,结果是:
sequences
____________
[1, 2, 4]
[1, 6, 3]
解决方案
这是 Spark >= 1.5 中使用内置size
函数的一种方法:
from pyspark.sql import Row
from pyspark.sql.functions import size
df = spark.createDataFrame([Row(a=[9, 3, 4], b=[8,9,10]),Row(a=[7, 2, 6, 4], b=[2,1,5]), Row(a=[7, 2, 4], b=[8,2,1,5]), Row(a=[2, 4], b=[8,2,10,12,20])])
df.where(size(df['a']) <= 3).show()
输出:
+---------+------------------+
| a| b|
+---------+------------------+
|[9, 3, 4]| [8, 9, 10]|
|[7, 2, 4]| [8, 2, 1, 5]|
| [2, 4]|[8, 2, 10, 12, 20]|
+---------+------------------+
推荐阅读
- firebase - RN Firebase:未触发通知方法;消息方法是
- sql - SQL Server 如果存在重复则忽略行,除非 id 存在
- xml - 如何让每个办公室使用 XSLT 在单独的页面上打印?
- javascript - 我可以在 loopbackjs API 中禁用“包含”过滤器功能吗?
- sql - 从动态表中动态获取列
- javascript - 输入值在 React 中没有更新
- blas - 将 Eigen 库与 CBLAS 一起使用
- c# - 如何在 EmguCV 中将图像转换为矩阵,然后将矩阵转换为位图?
- jquery - 引导关闭按钮未正确显示
- regex - 我想要正则表达式(自动机理论)