火花数据集:如何从列中获取唯一值的出现次数

Posted

技术标签:

【中文标题】火花数据集:如何从列中获取唯一值的出现次数【英文标题】:spark dataset : how to get count of occurence of unique values from a column 【发布时间】:2016-10-31 22:28:46 【问题描述】:

尝试读取 CSV 文件并计算特定字段中唯一值的出现次数的 spark dataset api。我认为应该起作用的一种方法没有按预期运行。让我知道我在忽略什么。我在下面发布了工作和错误的方法。

// get all records from a column
val professionColumn = data.select("profession")

// breakdown by professions in descending order
// *****  DOES NOT WORKS  ***** //
val  breakdownByProfession = professionColumn.groupBy().count().collect()

// *****  WORKS  ***** //
val  breakdownByProfessiond = data.groupBy("profession").count().sort("count")  // WORKS

println ( s"\n\nbreakdown by profession \n")
breakdownByProfession.show()

另外请告诉我哪种方法更有效。我的猜测将是第一个(首先尝试的原因) 另外,使用数据集 API 将此类操作的输出保存在文本文件中的最佳方法是什么

【问题讨论】:

【参考方案1】:

在第一种情况下,由于没有指定分组列,因此整个数据集被视为一个组——即使数据集中只有一个列,这种行为仍然成立。因此,您应该始终将列列表传递给groupBy()

现在两个选项将是:data.select("profession").groupBy("profession").countdata.groupBy("profession").count。在大多数情况下,这两种替代方案的性能将完全相同,因为 Spark 会尽可能地将投影(即列选择)向下推到运算符中。因此,即使在 data.groupBy("profession").count 的情况下,Spark 在进行分组之前也会首先选择 profession 列。你可以通过查看执行计划来验证这一点——org.apache.spark.sql.Dataset.explain()

【讨论】:

感谢您提供非常详细的解释,因此请确认通过选择创建单列 RDD 然后对其执行操作是否会不会导致任何性能提升与在指定列名时对整个数据集进行操作相比? 在这种情况下,先选择不会有任何性能提升。这是因为select 被向下推到了groupby 您可以查看两种替代方案的解释计划......即data.select("profession").groupBy("profession").count.explaindata.groupBy("profession").count.explain。您应该注意到,在这两种情况下,先进行选择,然后再进行分组。【参考方案2】:

在 groupBy 转换中,您需要提供如下列名

val  breakdownByProfession = professionColumn.groupBy().count().collect()

【讨论】:

那么即使 RDD 包含一列,我们还需要在 groupby 函数中指定该列吗?顺便说一句,我假设你的意思是professionColumn.groupBy("profession").count().collect()

以上是关于火花数据集:如何从列中获取唯一值的出现次数的主要内容,如果未能解决你的问题,请参考以下文章

Sqlite3 从列中具有相似值的行获取数据

Rails:如何从列中获取唯一值

熊猫计算列中每个值的出现次数

列中每行具有唯一值的 Python/CSV 唯一行

计算火花数据框中所有列(300 列)的每个不同值的出现次数

如何从列分隔的数据集到逗号分隔的数据集?