这可能是一个简单的问题,但基本上我有一个数据集,我可以计算每个国家的女性人数。最终我想按国家对每个计数进行分组,但我不确定该值的用途,因为数据集中没有可用作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) 等等 任何帮助都会很棒。 感谢
答案 0 :(得分:15)
你快到了!您所需要的只是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()
答案 1 :(得分: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()
如果你想更深入地进行这种操作,这里是指南: https://spark.apache.org/docs/latest/sql-programming-guide.html
答案 2 :(得分:0)
您可以轻松创建密钥,它不必位于文件/数据库中。例如:
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();