Spark DataFrame - 选择n个随机行

时间:2016-09-06 08:57:02

标签: java apache-spark dataframe

我有一个包含数千条记录的数据框,我想随机选择1000行到另一个数据框进行演示。我怎么能用Java做到这一点?

谢谢!

3 个答案:

答案 0 :(得分:18)

您可以随机播放行,然后选择最高行:

import org.apache.spark.sql.functions.rand

dataset.orderBy(rand()).limit(n)

答案 1 :(得分:5)

您可以尝试使用sample()方法。不可否认,你必须给那里一个数字,但不是分数。你可以写这样的函数:

def getRandom (dataset : Dataset[_], n : Int) = {
    val count = dataset.count();
    val howManyTake = if (count > n) n else count;
    dataset.sample(0, 1.0*howManyTake/count).limit (n)
}

说明: 我们必须采取一小部分数据。如果我们有2000行而你想获得100行,那么我们必须有0.5行。如果要获得比DataFrame更多的行,则必须获得1.0。 调用limit()函数以确保舍入是正确的,并且您没有获得比您指定的更多的行。

编辑:我在其他答案中看到了takeSample方法。但请记住:

  1. 它是一种RDD方法,而不是数据集,所以你必须这样做: dataset.rdd.takeSample(0, 1000, System.currentTimeMilis()).toDF() takeSample将收集所有值。
  2. 请记住,如果您想获得很多行,那么您将遇到OutOfMemoryError问题,因为takeSample正在收集驱动程序中的结果。小心使用

答案 2 :(得分:2)

我希望在pyspark中使用

df.sample(withReplacement=False, fraction=desired_fraction)

这里是doc