首页 > 解决方案 > 根据条件从 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]

标签: pyspark

解决方案


这是 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]|
+---------+------------------+

推荐阅读