2016-12-12 1 views
2

Ich habe einen Datensatz mit der folgenden StrukturWie String zählt in Funken (Java) mit Datensatz

+--------------------+--------------------+--------------------+-----+ | content | entities | id|topic| +--------------------+--------------------+--------------------+-----+

Entitäten sind eine Liste von Strings, benannten Entitäten aggregieren, und das Thema eine ganze Zahl.

Ich möchte das Aussehen jeder einzelnen Entität in einem Thema zusammenfassen.

Mein erster Schritt ist

table.groupBy("topic");

Dann möchte ich aggregieren, aber wie kann ich das tun, ich tought über einen benutzerdefinierten Aggregator Implementierung, aber dann brauche ich einen Encoder für Map<String,Integer>, die ich don‘ Ich weiß, wie man etwas schafft.

Wie kann ich diese Aggregation machen?

+0

Um sicher zu sein: entities ist eine Liste, also id = 1, entities = a, b, c; id = 2, Einheiten: b, e, f, r? –

+0

ja, genau das – amaik

Antwort

1

Ich bin mir nicht sicher, was Sie genau berechnen wollen, aber beide Optionen, die ich benötigt die gleiche Funktion sehen kann verwendet werden.

Ok, Testdaten:

import org.apache.spark.sql.types._ 
import org.apache.spark.sql._ 
import sqlContext.implicits._ 

val list = Seq((1, "topic1", Array("a", "b", "c", "b")), (2, "topic1", Array("b", "c", "r")), (3, "topic2", Array("e", "b", "c", "e")), (4, "topic2", Array("b", "c", "e", "r"))) 
val df = sc.parallelize(list).toDF("id", "topic", "entities"); 

Berechnung, wie viele Einheiten jeder Art sind in jedem Thema:

df 
    .withColumn("entity", explode('entities)) 
    .groupBy('topic, 'entity) 
    .count() 
    .show(); 

Ergebnisse werden sein:

+------+------+-----+ 
| topic|entity|count| 
+------+------+-----+ 
|topic1|  a| 1| 
|topic1|  b| 3| 
|topic1|  c| 2| 
|topic1|  r| 1| 
|topic2|  b| 2| 
|topic2|  c| 2| 
|topic2|  e| 3| 
|topic2|  r| 1| 
+------+------+-----+ 

Wie viele verschiedene Entitäten habe jedes Thema:

df 
    .withColumn("entity", explode('entities)) 
    .groupBy('topic) 
    .agg(countDistinct('entity)) 
    .show(); 

Ergebnisse werden sein:

+------+-------------+ 
| topic|count(entity)| 
+------+-------------+ 
|topic1|   4| 
|topic2|   4| 
+------+-------------+ 

Schlüssel der Antwort

Sie Funktion explodieren verwenden sollten viele Zeilen für jede Spalte Einheiten zu schaffen; entities = a, b, c erzeugt 3 Zeilen

0

Wenn Sie nur die Gesamtzahl der Entitäten pro Thema zählen, können Sie die Zählfunktion verwenden, anstatt einen benutzerdefinierten Aggregator schreiben zu müssen. Kommen gerade aus dem Spark-Tutorial: http://spark.apache.org/docs/latest/sql-programming-guide.html:

table.groupBy("topic").count().show(); 
+0

Nein, ich möchte die Anzahl für jede Entität in einem Thema zusammenfassen. Klärte die Frage ein wenig – amaik