Spark - 如何按键计算记录数
Spark - How to count number of records by key
这可能是一个简单的问题,但基本上我有一个数据集,我可以在其中计算每个国家/地区的女性人数。最后,我想按国家/地区对每个计数进行分组,但我不确定该值使用什么,因为数据集中没有计数列可用作 groupByKey 或 reduceByKey 中的值。我想过使用 reduceByKey() 但这需要一个键值对,我只想计算键并将计数器作为值。我该怎么做?
val lines = sc.textFile("/home/cloudera/desktop/file.txt")
val split_lines = lines.map(_.split(","))
val femaleOnly = split_lines.filter(x => x._10 == "Female")
这是我卡住的地方。该国家/地区在数据集中的索引也为 13。
输出应该是这样的:
(澳大利亚,201000)
(美国,420000)
ETC
任何帮助都会很棒。
谢谢
您可以轻松地创建一个 key,它不必在 file/database 中。例如:
val countryGender = sc.textFile("/home/cloudera/desktop/file.txt")
.map(_.split(","))
.filter(x => x._10 == "Female")
.map(x => (x._13, x._10)) // <<<< here you generate a new key
.groupByKey();
您是否考虑过使用 Dataframes API 来操纵您的 RDD?
您似乎正在加载 CSV 文件,您可以使用 spark-csv.
那么这是一件简单的事情(如果您的 CSV 标题带有明显的列名):
import com.databricks.spark.csv._
val countryGender = sqlContext.csvFile("/home/cloudera/desktop/file.txt") // already splits by field
.filter($"gender" === "Female")
.groupBy("country").count().show()
如果您想更深入地了解这种操作,请阅读以下指南:
https://spark.apache.org/docs/latest/sql-programming-guide.html
你快到了!您只需要 countByValue:
val countOfFemalesByCountry = femaleOnly.map(_(13)).countByValue()
// Prints (Australia, 230), (America, 23242), etc.
(在您的示例中,我假设您指的是 x(10) 而不是 x._10)
总计:
sc.textFile("/home/cloudera/desktop/file.txt")
.map(_.split(","))
.filter(x => x(10) == "Female")
.map(_(13))
.countByValue()
这可能是一个简单的问题,但基本上我有一个数据集,我可以在其中计算每个国家/地区的女性人数。最后,我想按国家/地区对每个计数进行分组,但我不确定该值使用什么,因为数据集中没有计数列可用作 groupByKey 或 reduceByKey 中的值。我想过使用 reduceByKey() 但这需要一个键值对,我只想计算键并将计数器作为值。我该怎么做?
val lines = sc.textFile("/home/cloudera/desktop/file.txt")
val split_lines = lines.map(_.split(","))
val femaleOnly = split_lines.filter(x => x._10 == "Female")
这是我卡住的地方。该国家/地区在数据集中的索引也为 13。 输出应该是这样的: (澳大利亚,201000) (美国,420000) ETC 任何帮助都会很棒。 谢谢
您可以轻松地创建一个 key,它不必在 file/database 中。例如:
val countryGender = sc.textFile("/home/cloudera/desktop/file.txt")
.map(_.split(","))
.filter(x => x._10 == "Female")
.map(x => (x._13, x._10)) // <<<< here you generate a new key
.groupByKey();
您是否考虑过使用 Dataframes API 来操纵您的 RDD?
您似乎正在加载 CSV 文件,您可以使用 spark-csv.
那么这是一件简单的事情(如果您的 CSV 标题带有明显的列名):
import com.databricks.spark.csv._
val countryGender = sqlContext.csvFile("/home/cloudera/desktop/file.txt") // already splits by field
.filter($"gender" === "Female")
.groupBy("country").count().show()
如果您想更深入地了解这种操作,请阅读以下指南: https://spark.apache.org/docs/latest/sql-programming-guide.html
你快到了!您只需要 countByValue:
val countOfFemalesByCountry = femaleOnly.map(_(13)).countByValue()
// Prints (Australia, 230), (America, 23242), etc.
(在您的示例中,我假设您指的是 x(10) 而不是 x._10)
总计:
sc.textFile("/home/cloudera/desktop/file.txt")
.map(_.split(","))
.filter(x => x(10) == "Female")
.map(_(13))
.countByValue()