如何为具有True、False和Null值的布尔字段创建分层样本



我有一个带有布尔字段的DataFrame。

df = spark.createDataFrame([
[True],   
[False],   
[None],
[True],   
[False],
[None]
]).toDF("match")

我想创建一个具有相等True、False和Null值的分层示例(PySpark(。

如何在我的样本中也获得Null值(不接受None: 0.3(

sampled = df.sampleBy("match", fractions={True: 0.3, False: 0.3})

根据sampleBy方法的源代码,参数fractionsMap[T, Double],对于带有Spark的MapType列,不允许有空键(请参阅文档(

def sampleBy[T](col: String, fractions: Map[T, Double], seed: Long): DataFrame = {
sampleBy(Column(col), fractions, seed)
}

一种可能的解决方案是添加一个标志,将FalseTrueNULL转换为012,然后基于该标志执行sampleBy,例如:

from pyspark.sql.functions import expr
df_sample = df.withColumn('flag', expr("coalesce(int(match), 2)")) 
.sampleBy("flag", {0:0.3, 1:0.3, 2:0.3}) 
.drop("flag")

最新更新