如何使用Apache Spark迭代Elasticsearch源代码?

时间:2015-02-19 07:45:58

标签: elasticsearch apache-spark

我正在尝试通过将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中的弹性搜索输出并创建如上所述的类似地图,那么可能是等效映射?如果有任何我可以参考的示例代码,那将会有很大的帮助。

2 个答案:

答案 0 :(得分:1)

没有直接回答Spark问题的道歉,但是如果你错过了它,有一个描述,在这里使用elasticsearch对MovieLens数据做推荐:http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/_significant_terms_demo.html

答案 1 :(得分:0)

您尚未在ElasticSearch中指定数据的格式。但我们假设它包含字段userIdmovieIdrating,因此示例文档看起来像{"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);
        }
    }
);