我正在尝试通过将Elasticsearch与Apache Spark集成来构建推荐系统。我正在使用Java。我使用movilens数据集作为示例数据。我也将数据索引到Elasticsearch。到目前为止,我已经能够从Elasticsearch索引读取输入如下:
SparkConf conf = new SparkConf().setAppName("Example App").setMaster("local");
conf.set("spark.serializer", org.apache.spark.serializer.KryoSerializer.class.getName());
conf.set("es.nodes", "localhost");
conf.set("es.port", "9200");
JavaSparkContext sc = new JavaSparkContext(conf);
JavaPairRDD<String, Map<String, Object>> esRDD = JavaEsSpark.esRDD(sc, "movielens/recommendation");
使用esRDD.collect()函数,我可以看到我正在从弹性搜索中正确检索数据。现在我需要将用户ID,项目ID和首选项从Elasticsearch结果提供给Spark的推荐。如果我使用的是csv文件,我可以按如下方式进行:
String path = "resources/user_data.data";
JavaRDD<String> data = sc.textFile(path);
JavaRDD<Rating> ratings = data.map(
new Function<String, Rating>() {
public Rating call(String s) {
String[] sarray = s.split(" ");
return new Rating(Integer.parseInt(sarray[0]), Integer.parseInt(sarray[1]),
Double.parseDouble(sarray[2]));
}
}
);
如果我需要迭代存储在esRDD中的弹性搜索输出并创建如上所述的类似地图,那么可能是等效映射?如果有任何我可以参考的示例代码,那将会有很大的帮助。
答案 0 :(得分:1)
没有直接回答Spark问题的道歉,但是如果你错过了它,有一个描述,在这里使用elasticsearch对MovieLens数据做推荐:http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/_significant_terms_demo.html
答案 1 :(得分:0)
您尚未在ElasticSearch中指定数据的格式。但我们假设它包含字段userId
,movieId
和rating
,因此示例文档看起来像{"userId":1,"movieId":1,"rating":4}
。
然后你应该能够做到(忽略空检查等):
JavaRDD<Rating> ratings = esRDD.map(
new Function<Map<String, Object>, Rating>() {
public Rating call(Map<String, Object> m) {
Int userId = Integer.parseInt(m.get("userId"));
Int movieId = Integer.parseInt(m.get("movieId"));
Double rating = Double.parseDouble(m.get("rating"));
return new Rating(userId, movieId, rating);
}
}
);