Python 3.x 如何为具有真、假和空值的布尔字段创建分层采样?

Python 3.x 如何为具有真、假和空值的布尔字段创建分层采样?,python-3.x,pyspark,sample,Python 3.x,Pyspark,Sample,我有一个带有布尔字段的数据框 df = spark.createDataFrame([ [True], [False], [None], [True], [False], [None] ]).toDF("match") 我想创建一个具有相同真、假和空值的分层样本(PySpark) 如何在我的示例中也获取空值(None:0.3不被接受) 基于ofsampleBy方法,参数sections是一个Map[T,Double],对于带有Spa

我有一个带有布尔字段的数据框

df = spark.createDataFrame([
  [True],   
  [False],   
  [None],
  [True],   
  [False],
  [None]
]).toDF("match")
我想创建一个具有相同真、假和空值的分层样本(PySpark)

如何在我的示例中也获取空值(
None:0.3
不被接受)

基于of
sampleBy
方法,参数
sections
是一个
Map[T,Double]
,对于带有Spark的MapType列,不允许使用空键(请参阅)

一种可能的解决方案是添加一个标志,将
False
True
NULL
转换为
0
1
2
,然后基于该标志进行采样,例如:

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")

非常感谢。很好的解决方案。如果您将此作为答案添加,我可以接受(并且您还可以获得赏金积分;-))
def sampleBy[T](col: String, fractions: Map[T, Double], seed: Long): DataFrame = {
  sampleBy(Column(col), fractions, seed)
}
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")