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
相关产品推荐
相关产品推荐

