spark 数据集:如何从列中获取唯一值的出现次数
spark dataset : how to get count of occurence of unique values from a column
尝试读取 CSV 文件并计算特定字段中唯一值出现次数的 spark 数据集 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 将此类操作的输出保存在文本文件中的最佳方法是什么
在第一种情况下,由于没有指定分组列,因此整个数据集被视为一个组——即使数据集中只存在一个列,这种行为仍然存在。因此,您应该始终将列列表传递给 groupBy()
.
现在两个选项是:data.select("profession").groupBy("profession").count
与 data.groupBy("profession").count
。在大多数情况下,这两种替代方案的性能将完全相同,因为 Spark 会尽可能地将投影(即列选择)推向运算符。因此,即使在 data.groupBy("profession").count
的情况下,Spark 在进行分组之前也会先选择 profession
列。您可以通过查看执行计划来验证这一点 -- org.apache.spark.sql.Dataset.explain()
在 groupBy 转换中,您需要提供如下列名称
val breakdownByProfession = professionColumn.groupBy().count().collect()
尝试读取 CSV 文件并计算特定字段中唯一值出现次数的 spark 数据集 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 将此类操作的输出保存在文本文件中的最佳方法是什么
在第一种情况下,由于没有指定分组列,因此整个数据集被视为一个组——即使数据集中只存在一个列,这种行为仍然存在。因此,您应该始终将列列表传递给 groupBy()
.
现在两个选项是:data.select("profession").groupBy("profession").count
与 data.groupBy("profession").count
。在大多数情况下,这两种替代方案的性能将完全相同,因为 Spark 会尽可能地将投影(即列选择)推向运算符。因此,即使在 data.groupBy("profession").count
的情况下,Spark 在进行分组之前也会先选择 profession
列。您可以通过查看执行计划来验证这一点 -- org.apache.spark.sql.Dataset.explain()
在 groupBy 转换中,您需要提供如下列名称
val breakdownByProfession = professionColumn.groupBy().count().collect()