Мой документ MongoDB выглядит так
{
"_id":"sdf23sddfsd",
"the_list":[
{
"Sentiment":[
"Negative",
"Positive",
"Positive"
]
},
{
"Sentiment":[
"Neutral",
"Positive"
]
}
],
"some_other_list":[
{
"Sentiment":[
"Positive",
"Positive",
"Positive"
]
}
]
}
Я пытаюсь написать приложение Spark/Java, чтобы получить общее количество каждого Sentiments
из the_list
и some_other_list
// Create a JavaSparkContext using the SparkSession's SparkContext object
JavaSparkContext jsc = new JavaSparkContext(spark.sparkContext());
// Create a custom ReadConfig
Map<String, String> readOverrides = new HashMap<String, String>();
readOverrides.put("collection", "tmp");
//readOverrides.put("readPreference.name", "secondaryPreferred");
ReadConfig readConfig =
ReadConfig.create(jsc).withOptions(readOverrides);
// Load data using the custom ReadConfig
JavaMongoRDD<Document> customRdd = MongoSpark.load(jsc, readConfig);
Я тестировал выше, что может отлично получить значения, выполнив это
System.out.println(((Document)((ArrayList)customRdd.first().get("the_list")).get(0)).get("Sentiments"));
//Prints [Negative, Neutral]
Но я не понимаю, как агрегировать количество настроений как таковое:
{
"_id":"sdf23sddfsd",
"the_list":{
"Negative":1,
"Positive":3,
"Neutral":1
},
"some_other_list":{
"Positive":1
}
}
Я добрался до здесь, что неправильно, потому что он смотрит только на 0 индекс the_list
JavaRDD<String> sentimentsRDD= customRdd.flatMap(document -> ((Document)((ArrayList)document.get("the_list")).get(0)).get("Sentiments"));
Я знаю, что мы можем сделать это напрямую в MongoDB, но мне нужно научиться делать это в Spark для таких структурированных данных, чтобы я использовал это обучение для других случаев использования, которые требуют дополнительных манипуляций с каждым документом в коллекции.