You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PySpark的DataFrame.randomSplit()更新数据集后拆分结果是否稳定?

问题结论

直接用固定seed的randomSplit无法保证原有ID的分组不变,存在原有分组被污染的风险。

原因解释

Spark的randomSplit实现逻辑是基于全量数据集生成伪随机序列匹配权重拆分,它的稳定拆分成立的前提是两次运行的数据集内容、行顺序、分区逻辑完全一致。当你新增数据之后,全量数据集的行排列、分区都可能发生变化,哪怕固定了seed,原有行匹配到的随机分组结果也可能发生改变,你举的例子里原来在group1的A/B/C/D确实有可能被重新分到group2。

适配需求的实现方案

如果要实现新增数据不改变原有ID的分组,应该改用基于唯一ID的确定性哈希拆分替代randomSplit,示例代码逻辑如下:

# 按80%训练集、20%测试集的权重拆分,拆分阈值设为0.8
from pyspark.sql.functions import xxhash64, lit

# 对lifetime_id做哈希,归一化到0-1区间后和阈值比较,分组完全由ID本身决定,和数据集其他内容无关
hashed_df = unique_lifetimes_spark_df.select("lifetime_id").distinct() \
    .withColumn("hash_val", (xxhash64("lifetime_id", lit(42)) % 1000000) / 1000000)
train = hashed_df.filter(hashed_df.hash_val < 0.8)
test = hashed_df.filter(hashed_df.hash_val >= 0.8)

这种方案下,每个ID的哈希值是固定的,无论后续新增多少ID,原有ID的分组永远不会变化,仅新增的ID会按照哈希值自动匹配到对应分组,完全符合你需要的增量扩展要求。

内容的提问来源于stack exchange,提问作者Aesir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 08:24:02