Scala Spark:如何从Spark数据帧的列中引导样本?

Scala Spark:如何从Spark数据帧的列中引导样本?,scala,apache-spark,Scala,Apache Spark,我希望在集群环境中的Jupyter笔记本设置中使用Scala编程语言,从Spark数据帧的一列中采样值,并进行替换。我该怎么做 我尝试了在网上找到的以下功能: import scala.util def bootstrapMean(originalData: Array[Double]): Double = { val n = originalData.length def draw: Double = originalData(util.Random.nextInt(n))

我希望在集群环境中的Jupyter笔记本设置中使用Scala编程语言,从Spark数据帧的一列中采样值,并进行替换。我该怎么做

我尝试了在网上找到的以下功能:

import scala.util

def bootstrapMean(originalData: Array[Double]): Double = {
  val n = originalData.length

  def draw: Double = originalData(util.Random.nextInt(n))

  // a tail recursive loop to randomly draw and add a value to the accumulating sum
  def drawAndSumValues(current: Int, acc: Double = 0D): Double = {
    if (current == 0) acc
    else drawAndSumValues(current - 1, acc + draw)
  }
  drawAndSumValues(n) / n
}
像这样:

val data = stack.select("column_with_values").collect.map(_.toSeq).flatten
val m = 10
val bootstraps = Vector.fill(m)(bootstrapMean(data))
但我得到了一个错误:

An error was encountered:
<console>:47: error: type mismatch;
 found   : Array[Any]
 required: Array[Double]
Note: Any >: Double, but class Array is invariant in type T.
You may wish to investigate a wildcard type such as `_ >: Double`. (SLS 3.2.10)
       val bootstraps = Vector.fill(m)(bootstrapMean(data))
遇到错误:
:47:错误:类型不匹配;
找到:数组[任何]
必需:数组[双精度]
注意:Any>:Double,但是类数组在类型T中是不变的。
您可能希望研究一种通配符类型,例如“\u>:Double”。(补充说明3.2.10)
val bootstraps=Vector.fill(m)(bootstrapMean(数据))
我不知道如何调试它,也不知道我是否应该费心去调试或尝试另一种方法。我正在寻找想法/文档/代码。谢谢

更新:

如何将用户mck的解决方案放在下面的for循环中?我尝试了以下方法:

var bootstrap_container = Seq()
var a = 1
for( a <- 1 until 3){
    var sampled = stack_b.select("diff_hours").sample(withReplacement = true, fraction = 0.5, seed = a)
    var smpl_average = sampled.select(avg("diff_hours")).collect()(0)(0)
    var bootstrap_smpls = bootstrap_container.union(Seq(smpl_average)).collect()
}
bootstrap_smpls
var bootstrap\u container=Seq()
变量a=1

对于(a您可以使用数据帧的
sample
方法,例如,如果您希望使用替换和0.5的分数进行采样:

val sampled = stack.select("column_with_values").sample(true, 0.5)
要获得平均值,您可以执行以下操作:

val col_average = sampled.select(avg("column_with_values")).collect()(0)(0)
编辑

var bootstrap_container = List[Double]()
var a = 1
for( a <- 1 until 3){
    var sampled = stack_b2.select("diff_hours").sample(withReplacement = true, fraction = 0.5, seed = a)
    var smpl_average = sampled.select(avg("diff_hours")).collect()(0)(0)
    bootstrap_container = bootstrap_container :+ smpl_average.asInstanceOf[Double]
}
var mean_bootstrap = bootstrap_container.reduce(_ + _) / bootstrap_container.length
var bootstrap\u container=List[Double]()
变量a=1

对于(a这很有帮助。但如何将其放入循环以生成x个样本?我原以为这样做很简单,但最终超出了我目前的能力。@user2205916您不能将其放入for循环吗?如果您再次调用它,它将提供不同的示例方式?我更新了我的问题,以显示我尝试过的for循环代码。@user2205916请参阅编辑后的回答谢谢。我很无助,但显然,您如何找到
bootstrap\u container
元素的平均值?此外,更一般地说,Python有
dir(object)
来找出它可以使用的所有函数。在笔记本环境中,Scala的等效值是什么?
var bootstrap_container = List[Double]()
var a = 1
for( a <- 1 until 3){
    var sampled = stack_b2.select("diff_hours").sample(withReplacement = true, fraction = 0.5, seed = a)
    var smpl_average = sampled.select(avg("diff_hours")).collect()(0)(0)
    bootstrap_container = bootstrap_container :+ smpl_average.asInstanceOf[Double]
}
var mean_bootstrap = bootstrap_container.reduce(_ + _) / bootstrap_container.length