Spark 检查数据集中是不是有至少 n 个元素

Posted

技术标签:

【中文标题】Spark 检查数据集中是不是有至少 n 个元素【英文标题】:Spark Check if there is At Least n element in datasetSpark 检查数据集中是否有至少 n 个元素 【发布时间】:2018-09-11 14:01:14 【问题描述】:

我正在使用 Spark (2.3.1) 对数据集进行一些处理。出于某种原因,我想在进行计算之前知道我的数据集中是否有足够的数据。

这样做的基本解决方案如下:

int count = myDataset.count();
int threshold = 100;

if (count>threshold)
    // compute
else
    System.out.println("Not enough data to do computation");

但它确实效率低下。另一个更有效的解决方案是使用 countApprox() 函数。

int count = (long) (myDataset.rdd().countApprox(1000,0.90).getFinalValue().mean());

但就我而言,它可能会更有效率。

解决这个问题的最佳方法是什么?

注意:

我正在考虑迭代我的数据,手动计算我的行数并在达到阈值时停止,但我不确定这是最好的解决方案。

【问题讨论】:

你的数据来源是什么? @nakeuh 你能检查一下答案,看看它是否适合你吗? 数据小于阈值的概率是多少?后续流程如何? myDataset 是如何创建的? 数据小于阈值的可能性很小但不可忽略。 myDataset 是从数据库中读取的数据集,映射很少(从时间戳中提取星期几,规范化列名,过滤一些行等......)。然后我使用这个数据集来提供一些机器学习算法(MLLIB 或其他),并且我只想在我有足够的输入数据的情况下生成我的 ML 模型。 【参考方案1】:

如果你做myDataset.count(),它会扫描完整的数据,可能会很慢。

为了加快速度,您可以对数据集执行limit(threshold+1)。这将返回另一个包含threshold+1 行的数据集。对此,你可以.count()

整数阈值 = 100; int totalRowsAfterLimit = myDataset.limit(threshold+1).count(); 如果(totalRowsAfterLimit > 阈值) // 计算 别的 System.out.println("没有足够的数据进行计算");

limit(threshold+1) 将确保您的基础作业只读取有限数量的记录,并且会更快地完成。

【讨论】:

【参考方案2】:

也许,“限制”可以更有效:

df.limit(threshold).count()

【讨论】:

以上是关于Spark 检查数据集中是不是有至少 n 个元素的主要内容,如果未能解决你的问题,请参考以下文章