我有一个包含约1500列的数据集,我试图将所有列中的零替换为Null。我如何在Pyspark中高效地完成这个操作?
我尝试使用spark的UDF,但由于数据宽度大,我无法并行处理多个列。
回答:
我们不需要使用UDF。你可以使用spark内置函数df.na.replace
来实现。你可以在这里找到更多信息这里。我提供了一个简单的例子来实现同样的效果。
from pyspark.sql import functions as F df = sc.parallelize([(1, 0, 5), (1,2, 0), (0,4, 5), (1,7, 0), (0,0, 3), (2,0, 5), (2,3, 0)]).toDF(["a", "b", "c"]) +---+---+---+ | a| b| c| +---+---+---+ | 1| 0| 5| | 1| 2| 0| | 0| 4| 5| | 1| 7| 0| | 0| 0| 3| | 2| 0| 5| | 2| 3| 0| +---+---+---+ df1=df.na.replace(0,None).show() +----+----+----+ | a| b| c| +----+----+----+ | 1|null| 5| | 1| 2|null| |null| 4| 5| | 1| 7|null| |null|null| 3| | 2|null| 5| | 2| 3|null| +----+----+----+
计算df中不同值的数量
from pyspark.sql import functions as F df2=df1.agg(*(F.countDistinct(F.col(c)).alias(c) for c in df.columns)) df2.show() +---+---+---+ | a| b| c| +---+---+---+ | 2| 4| 2| +---+---+---+
计算99%和1%的值。
df1.summary('99%', '1%').show() +-------+---+---+---+ |summary| a| b| c| +-------+---+---+---+ | 99%| 2| 7| 5| | 1%| 1| 2| 3| +-------+---+---+---+