【问题标题】:What does withReplacement do, if specified for sample against a Spark Dataframe如果针对 Spark Dataframe 指定样本,withReplacement 会做什么
【发布时间】:2018-12-17 05:12:26
【问题描述】:

阅读 spark 文档:http://spark.apache.org/docs/2.1.0/api/python/pyspark.sql.html#pyspark.sql.DataFrame.sample

有这个布尔参数withReplacement,不用多解释。

sample(withReplacement, fraction, seed=None)

它是什么以及我们如何使用它?

【问题讨论】:

  • 有替换意味着一行数据可以多次被选中进入样本,不替换意味着一行只能被选中一次进入样本

标签: apache-spark


【解决方案1】:

参数withReplacement控制sample结果的唯一性。如果我们将数据集视为一桶球,withReplacement=true 表示从桶中取出一个随机球并将其放回其中。这意味着,可以再次捡起同一个球。

假设数据集中的所有唯一元素:

  • withReplacement=truesample 的结果可以产生多次相同的元素。

  • withReplacement=false,数据集的每个元素只会被采样一次。

       import spark.implicits._
    
        val df = Seq(1, 2, 3, 5, 6, 7, 8, 9, 10).toDF("ids")
    
        df.show()
    
        df.sample(true, 0.5, 5)
          .show
    
        df.sample(false, 0.5, 5)
          .show
    

    结果

    +---+
    |ids|
    +---+
    |  1|
    |  2|
    |  3|
    |  5|
    |  6|
    |  7|
    |  8|
    |  9|
    | 10|
    +---+
    
    +---+
    |ids|
    +---+
    |  6|
    |  7|
    |  7|
    |  9|
    | 10|
    +---+
    
    +---+
    |ids|
    +---+
    |  1|
    |  3|
    |  7|
    |  8|
    |  9|
    +---+
    

【讨论】:

    【解决方案2】:

    这实际上是在 spark docs 版本 2.3 中提到的。 https://spark.apache.org/docs/2.3.0/api/python/pyspark.sql.html#pyspark.sql.DataFrame.sample

    withReplacement – 替换样本

    case class Member(id: Int, name: String, role: String)
    
    val member1 = new Member(1, "User1", "Data Engineer")
    val member2 = new Member(2, "User2", "Software Engineer")
    val member3 = new Member(3, "User3", "DevOps Engineer")
    
    val memberDF = Seq(member1, member2, member3).toDF
    memberDF.sample(true, 0.4).show
    
    +---+-----+-----------------+
    | id| name|             role|
    +---+-----+-----------------+
    |  1|User1|    Data Engineer|
    |  2|User2|Software Engineer|
    +---+-----+-----------------+
    
    memberDF.sample(true, 0.4).show
    
    +---+-----+---------------+
    | id| name|           role|
    +---+-----+---------------+
    |  3|User3|DevOps Engineer|
    +---+-----+---------------+
    
    memberDF.sample(true, 0.4).show
    
    +---+-----+-----------------+
    | id| name|             role|
    +---+-----+-----------------+
    |  2|User2|Software Engineer|
    |  3|User3|  DevOps Engineer|
    +---+-----+-----------------+
    

    【讨论】:

    • 您能否举例说明两者的区别?什么是可替换的,什么是不可替换的?
    • 更新了我的答案。 @YuchenZhong
    • 谢谢,但是这些例子能告诉我们什么吗?为什么第一个和第三个例子有两行,而第二个只有一行?
    猜你喜欢
    • 2016-08-23
    • 2012-08-17
    • 1970-01-01
    • 1970-01-01
    • 2013-12-16
    • 1970-01-01
    • 2015-05-27
    • 1970-01-01
    相关资源
    最近更新 更多