2

In Cassandra habe ich eine Liste Spalte Typ. Ich bin neu in Funken und Scala und habe keine Ahnung, wo ich anfangen soll. Im Funken möchte ich die Zählung der einzelnen Werte erhalten, ist es möglich, dies zu tun. Unten ist der DatenrahmenAnzahl der List-Werte in Spark - Datenframe

+--------------------+------------+ 
|     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]| 
+--------------------+------------+ 

Ich möchte Ausgabe als

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

Funken Version: 1.4

Antwort

4

Hier gehen Sie:

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

Dies auch mit dem Dataframe API eigentlich ganz einfach ist:

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

Sie müssen so etwas wie dieses (von Apache Spark Examples):

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

Erraten, dass Sie haben bereits Paare, .reduceByKey (_ + _) wird Ihnen zurückgeben brauchen.

können Sie auch versuchen, in Funken Shell etwas wie folgt aus:

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

kannst du bitte den Schnitt überprüfen –

Verwandte Themen