これはおそらく簡単な問題ですが、基本的には各国の女性の数を数えるデータセットがあります。最終的には、国ごとに各カウントをグループ化しますが、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)などありがとう
あなたはほとんどそこにいます!必要なのは 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()
Dataframes API を使用してRDDを操作することを検討しましたか?
spark-csv でできる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
keyを簡単に作成できます。ファイル/データベースにある必要はありません。例えば:
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();