Spark数据集:如何从一列中获得唯一值的出现计数



尝试spark数据集api,读取CSV文件并计数特定字段中唯一值的出现。我认为有一种方法是有效的,那就是不按预期行事。让我知道我忽略了什么。我张贴工作以及下面的bug方法。

// 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"nnbreakdown by profession n")
breakdownByProfession.show()

也请让我知道哪种方法更有效。我猜是第一个(首先尝试的原因)另外,使用数据集api

将这种操作的输出保存在文本文件中的最佳方法是什么?

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

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

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

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

相关内容

  • 没有找到相关文章