Comment agréger le nombre de chaînes dans Spark (Java) avec des ensembles de données
J'ai un DataSet avec la structure suivante
+--------------------+--------------------+--------------------+-----+ | content | entities | id|topic| +--------------------+--------------------+--------------------+-----+
entity est une liste de chaînes, d'entités nommées et le sujet est un entier.
Je veux résumer les apparences de chaque entité distincte dans un sujet.
Ma première étape est
table.groupBy("topic");
Ensuite, je veux agréger, mais comment puis-je faire cela, j'ai pensé à implémenter un agrégateur personnalisé, mais j'ai besoin d'un encodeur pour Map<String,Integer>
lequel je ne sais pas comment créer.
Comment puis-je faire cette agrégation?
Je ne sais pas ce que vous exactement voulez calculer, mais les deux options que je peux voir exige la même fonction à utiliser.
Ok, testez les données:
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");
Calcul du nombre d'entités de chaque type dans chaque rubrique:
df
.withColumn("entity", explode('entities))
.groupBy('topic, 'entity)
.count()
.show();
Les résultats seront:
+------+------+-----+
| 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|
+------+------+-----+
Combien d'entités distinctes ont chaque sujet:
df
.withColumn("entity", explode('entities))
.groupBy('topic)
.agg(countDistinct('entity))
.show();
Les résultats seront:
+------+-------------+
| topic|count(entity)|
+------+-------------+
|topic1| 4|
|topic2| 4|
+------+-------------+
Clé de réponse
Vous devez utiliser la fonction d'éclatement pour créer de nombreuses lignes pour chaque colonne d'entités; entités = a, b, c créera 3 lignes