PySpark:为DataFrame的给定行数更新列值

时间:2018-07-11 13:50:36

标签: apache-spark pyspark

我有一个DataFrame,其中包含10行和2列:一个带有随机标识符值的ID列和一个用VAL填充的None列。

vals = [
        Row(ID=1,VAL=None),
        Row(ID=2,VAL=None),
        Row(ID=3,VAL=None),
        Row(ID=4,VAL=None),
        Row(ID=5,VAL=None),
        Row(ID=6,VAL=None),
        Row(ID=7,VAL=None),
        Row(ID=8,VAL=None),
        Row(ID=9,VAL=None),
        Row(ID=10,VAL=None)
]
df = spark.createDataFrame(vals)

现在可以说我要为VAL列更新3行,其值为“ lets ”,3行,其值为“ bucket ”和4行的值为“ this ”。

在PySpark中有一种简单的方法吗?

注意:ID值不一定是连续的,存储区分布不一定是偶数

1 个答案:

答案 0 :(得分:0)

我将尝试用一些伪代码解释一个想法,然后将您映射到您的解决方案。

在一个分区上使用窗口函数,我们可以为数据帧中的每一行生成row_number()序列号,并将其存储在列row_num中。 接下来,您的“规则”可以表示为另一个小数据框:[min_row_num, max_row_num, label]

您需要做的就是将这两个数据集连接到行号上,添加新列:

df1.join(df2, 
   on=col('df1.row_num').between(col('min_row_num'), col('max_row_num'))
  )
.select('df1.*', 'df2.label')