Comment agréger le nombre de chaînes dans Spark (Java) avec des ensembles de données


amaik

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?

T. Gawęda

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

Articles connexes


Comment sous-ensembles de lignes avec des chaînes

je suis vieux Je veux utiliser functionpour composer de manière répétitive des ensembles avec des noms différents. par exemple, si j'ai 5 vecteurs aléatoires. number1<-sample(1:10, 3) number2<-sample(1:10, 3) number3<-sample(1:10, 3) number4<-sample(1:10, 3) n