【问题标题】:Same behaviour Scala Spark Sample and SampleBy相同的行为 Scala Spark Sample 和 SampleBy
【发布时间】:2021-05-20 11:22:21
【问题描述】:

我正在尝试在 Spark Dataframe 中执行分层采样,但 sampleBy 函数的行为(奇怪地)类似于 sample。

Spark 版本 3.0.1

import spark.implicits._

val data = Seq( ("Java", 20000), ("Java", 10000), ("Java", 3000),  ("Java", 17000),
                ("Python", 100000), ("Python", 20000),
                ("Scala", 3000), ("Scala", 4000), ("Scala", 1000), ("Scala", 43000), ("Scala", 2000), ("Scala", 9000)).toDF("Language", "Price")
val sample_size = 0.5
val seed = 762387
val stratify = "Language"

val subsample = data.sample(withReplacement=false, fraction=sample_size, seed=seed)

subsample.show()

val fractions = data.select(stratify).distinct().as[String].collect().map((_, sample_size)).toMap
println(fractions.mkString("\n")
val stratified_subsample = data.stat.sampleBy(stratify, fractions=fractions, seed=seed)

stratified_subsample.show()

输出:

+--------+------+
|Language| Price|
+--------+------+
|    Java|  3000|
|  Python|100000|
|  Python| 20000|
|   Scala|  3000|
|   Scala| 43000|
|   Scala|  2000|
|   Scala|  9000|
+--------+------+

Scala -> 0.5
Python -> 0.5
Java -> 0.5

+--------+------+
|Language| Price|
+--------+------+
|    Java|  3000|
|  Python|100000|
|  Python| 20000|
|   Scala|  3000|
|   Scala| 43000|
|   Scala|  2000|
|   Scala|  9000|
+--------+------+

使用另一个种子 (6354345) 输出:

+--------+------+
|Language| Price|
+--------+------+
|    Java| 10000|
|    Java| 17000|
|  Python|100000|
|   Scala|  3000|
|   Scala|  4000|
|   Scala|  1000|
|   Scala| 43000|
|   Scala|  2000|
|   Scala|  9000|
+--------+------+

Scala -> 0.5
Python -> 0.5
Java -> 0.5

+--------+------+
|Language| Price|
+--------+------+
|    Java| 10000|
|    Java| 17000|
|  Python|100000|
|   Scala|  3000|
|   Scala|  4000|
|   Scala|  1000|
|   Scala| 43000|
|   Scala|  2000|
|   Scala|  9000|
+--------+------+

我尝试过使用不同的数据帧、不同的种子,并且两个数据帧总是相等的。我总是有同样的行为,样本根本没有分层。我知道 sampleBy 不准确,但具有相同的行为似乎并不好。我的 sn-p 有什么问题吗?

【问题讨论】:

  • 谢谢,我添加了另一个例子。我编辑了评论,因为“没有任何变化”我的意思是“两个函数之间的行为保持不变”。

标签: scala dataframe apache-spark sampling


【解决方案1】:

当您使用“种子”时,您将获得相同的样本。如果将其填充为 0,那么每次运行时都会得到不同的样本

【讨论】:

猜你喜欢
  • 2021-11-06
  • 1970-01-01
  • 1970-01-01
  • 2016-02-27
  • 2022-12-12
  • 2013-02-22
  • 2020-09-14
  • 1970-01-01
  • 2018-11-05
相关资源
最近更新 更多