2

私はリストの列型を持っています。私はスパークとスカラには新しく、どこから始めたらいいのかわかりません。 私は各値のカウントを取得したい、それを行うことは可能ですか? は以下火花 - データフレームのリスト値の数

+--------------------+------------+ 
|     id|  data| 
+--------------------+------------+ 
|53e5c3b0-8c83-11e...|  [b, c]| 
|508c1160-8c83-11e...|  [a, b]| 
|4d16c0c0-8c83-11e...| [a, b, c]| 
|5774dde0-8c83-11e...|[a, b, c, d]| 
+--------------------+------------+ 

は、私が欲しいデータフレームで出力

+--------------------+------------+ 
| value   |  count | 
+--------------------+------------+ 
|a     |  3  | 
|b     |  4  | 
|c     |  3  | 
|d     |  1  | 
+--------------------+------------+ 

スパークバージョンとして:1.4

答えて

4

ここに行く:

scala> val rdd = sc.parallelize(
    Seq(
    ("53e5c3b0-8c83-11e", Array("b", "c")), 
    ("53e5c3b0-8c83-11e1", Array("a", "b")), 
    ("53e5c3b0-8c83-11e2", Array("a", "b", "c")), 
    ("53e5c3b0-8c83-11e3", Array("a", "b", "c", "d")))) 
// rdd: org.apache.spark.rdd.RDD[(String, Array[String])] = ParallelCollectionRDD[22] at parallelize at <console>:27 

scala> rdd.flatMap(_._2).map((_, 1)).reduceByKey(_ + _) 
// res11: org.apache.spark.rdd.RDD[(String, Int)] = ShuffledRDD[21] at reduceByKey at <console>:30 

scala> rdd.flatMap(_._2).map((_,1)).reduceByKey(_ + _).collect 
// res16: Array[(String, Int)] = Array((a,3), (b,4), (c,3), (d,1)) 

これはまた、データフレームのAPIと、実際には非常に簡単です:

scala> val df = rdd.toDF("id", "data") 
// res12: org.apache.spark.sql.DataFrame = ["id": string, "data": array<string>] 

scala> df.select(explode($"data").as("value")).groupBy("value").count.show 
// +-----+-----+ 
// |value|count| 
// +-----+-----+ 
// | d| 1| 
// | c| 3| 
// | b| 4| 
// | a| 3| 
// +-----+-----+ 
2

あなたは(Apache Spark Examplesから)このようなものが必要です。

val textFile = sc.textFile("hdfs://...") 
val counts = textFile 
      .flatMap(line => line.split(" ")) 
      .map(word => (word, 1)) 
      .reduceByKey(_ + _) 

という推測をあなたはすでにペアを持っています.reduceByKey(_ + _)は必要。

また、スパークシェルで試すことができますこのような何か:

sc.parallelize(Array[Integer](1,1,1,2,2),3).map(x=>(x,1)).reduceByKey(_+_).foreach(println) 
+0

あなたは編集を確認してください –

関連する問題