我有一个带有布尔字段的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
方法的源代码,参数fractions
是Map[T, Double]
,对于带有Spark的MapType列,不允许有空键(请参阅文档(
def sampleBy[T](col: String, fractions: Map[T, Double], seed: Long): DataFrame = {
sampleBy(Column(col), fractions, seed)
}
一种可能的解决方案是添加一个标志,将False
、True
和NULL
转换为0
、1
和2
,然后基于该标志执行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")