如何解决如何为具有True,False和Null值的布尔字段创建分层样本?
我有一个带有布尔字段的DataFrame。
df = spark.createDataFrame([
[True],[False],[None],[True],[None]
]).toDF("match")
我想创建一个具有相等的True,False和Null值的分层样本(PySpark)。
我还如何获取示例中的Null值(不接受None: 0.3
)
sampled = df.sampleBy("match",fractions={True: 0.3,False: 0.3}
解决方法
基于sampleBy
方法的source code,参数fractions
是Map[T,Double]
,对于包含Spark的MapType列,不允许空键(请参阅doc)
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")
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。