Apache spark spark sampleBy behavior,是否具有确定性?当您提供种子时,相同的输入将获得相同的输出?

Apache spark spark sampleBy behavior,是否具有确定性?当您提供种子时,相同的输入将获得相同的输出?,apache-spark,pyspark,Apache Spark,Pyspark,我正在使用获取spark数据帧 samples = df.sampleBy("label", fractions, seed=314156) df是一个带有标签列的数据帧(顾名思义,它是每行的标签),分数是一个{label:fraction}的字典,如文档所示。数据帧总是从同一组csv文件(存储在s3中)加载数据,分数也是确定的(每次都相同) 这就是我得到的行为,在我使用pyspark 2.4(本地模式)的本地机器上,输出是确定性的(由samples.count()弱指示)。但是我在EMR(p

我正在使用获取spark数据帧

samples = df.sampleBy("label", fractions, seed=314156)
df是一个带有
标签
列的数据帧(顾名思义,它是每行的标签),分数是一个
{label:fraction}
的字典,如文档所示。数据帧总是从同一组csv文件(存储在s3中)加载数据,分数也是确定的(每次都相同)

这就是我得到的行为,在我使用pyspark 2.4(本地模式)的本地机器上,输出是确定性的(由
samples.count()
弱指示)。但是我在EMR(pyspark 2.3纱线)上得到了不同的结果


所以我的问题是,当您提供种子时,
sampleBy
的保证是什么?如何使结果具有确定性?同一个集群?或者相同的分区号?

至少在理论上
sampleBy
应该与父对象一样具有确定性-在您的情况下
df
。换句话说,如果上游没有不确定的操作(如洗牌),并且输入格式以确定的顺序加载数据,并且使用配置,那么结果应该是可再现的。因此,有许多运动部件,单靠种子是绝对不够的。那么,是什么使
sampleBy的数据帧
相同呢?不同的分区号算作不同还是相同?排序将使其具有确定性(前提是它是相同的ondisk持久数据集)?有文件参考吗?谢谢@User10938362不同的分区计数是一个因素。在另一个分区中,值的顺序不同。这两个问题都可能因许多因素而有所不同,尽管大多数问题都应该通过使用相同的配置来解决。就这一点而言,我不会打赌。由于排序需要初始采样,因此每次运行的采样可能会有所不同。尽管在分区内进行重新分区和排序,但使用唯一的确定性表达式应该是可行的。我不知道有任何官方文档,但如果您遵循源代码,您应该会了解每个分区种子的基本概念
sampleBy
->
函数。rand
->
rand
->感谢您的深入了解,让我对重新分区和排序分区进行更多的实验。至少不同环境中的结果是确定的,这意味着集群或本地开发人员中相同数据集上的sampleBy多运行是确定的,但不能跨环境运行。这可能是因为加载在同一环境中是确定的。@user10938362请添加您的注释作为答案,我可以接受。是的,实验表明
重新分区
然后
排序分区
有效。