web-dev-qa-db-ja.com

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")

ここで私は立ち往生しています。国は、データセットでもインデックス13です。出力は次のようになります:(オーストラリア、201000)(アメリカ、420000)などありがとう

9
user2768498

あなたはほとんどそこにいます!必要なのは 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()
15
dpeacock

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

5
huitseeker

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();
0
oleksii