Spark DataFrame - 选择 n 随机行

新手上路,请多包涵

我有一个包含数千条记录的数据框,我想随机选择 1000 行到另一个数据框中进行演示。我如何在 Java 中执行此操作?

谢谢!

原文由 lte__ 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

你可以试试 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 正在驱动程序中收集结果。小心使用

原文由 T. Gawęda 发布,翻译遵循 CC BY-SA 3.0 许可协议

Python 中,您可以打乱行,然后取最上面的行:

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

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

原文由 apatry 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题