尝试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()