spark-如何按键计算记录数

30byixjq  于 2021-06-02  发布在  Hadoop
关注(0)|答案(3)|浏览(390)

这可能是一个简单的问题,但基本上我有一个数据集,我要计算每个国家的女性人数。最终,我希望按国家对每个计数进行分组,但我不确定该值使用什么,因为数据集中没有一个计数列可以用作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)等等,任何帮助都是很好的。谢谢

siv3szwd

siv3szwd1#

您可以轻松地创建密钥,它不必在文件/数据库中。例如:

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();
3okqufwl

3okqufwl2#

您是否考虑过使用dataframesapi操作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

jdzmm42g

jdzmm42g3#

你快到了!您只需要一个countbyvalue:

val countOfFemalesByCountry = femaleOnly.map(_(13)).countByValue()
// Prints (Australia, 230), (America, 23242), etc.

(在你的例子中,我假设你的意思是x(10)而不是x.。\u 10)
总之:

sc.textFile("/home/cloudera/desktop/file.txt")
    .map(_.split(","))
    .filter(x => x(10) == "Female")
    .map(_(13))
    .countByValue()

相关问题