Spark - 如何按键计算记录数

use*_*498 9 cloud hadoop apache-spark

这可能是一个简单的问题,但基本上我有一个数据集,我可以计算每个国家的女性人数.最终我想按国家对每个计数进行分组,但我不确定该值的用途,因为数据集中没有可用作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")
Run Code Online (Sandbox Code Playgroud)

这是我被困的地方.该国家/地区也是数据集中的索引13.输出应该是这样的:(澳大利亚,201000)(美国,420000)等任何帮助都会很棒.谢谢

dpe*_*ock 15

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

val countOfFemalesByCountry = femaleOnly.map(_(13)).countByValue()
// Prints (Australia, 230), (America, 23242), etc.
Run Code Online (Sandbox Code Playgroud)

(在你的例子中,我假设你的意思是x(10)而不是x._10)

全部一起:

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


hui*_*ker 5

您是否考虑过使用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()
Run Code Online (Sandbox Code Playgroud)

如果你想深入了解这种操作,请参考指南:https: //spark.apache.org/docs/latest/sql-programming-guide.html