【问题标题】:Implement Hadoop Map with JavaPairRDD as Spark Way使用 JavaPairRDD 作为 Spark 方式实现 Hadoop Map
【发布时间】:2015-06-29 05:51:52
【问题描述】:

我有一个 RDD:

JavaPairRDD<Long, ViewRecord> myRDD

通过newAPIHadoopRDD 方法创建。我有一个现有的地图功能,我想以 Spark 方式实现它:

LongWritable one = new LongWritable(1L);

protected void map(Long key, ViewRecord viewRecord, Context context)
    throws IOException ,InterruptedException {

  String url = viewRecord.getUrl();
  long day = viewRecord.getDay();

  tuple.getKey().set(url);
  tuple.getValue().set(day);

  context.write(tuple, one);
};

PS:元组来源于:

KeyValueWritable<Text, LongWritable>

可以在这里找到:TextLong.java

【问题讨论】:

    标签: hadoop apache-spark


    【解决方案1】:

    我不知道元组是什么,但是如果您只想将记录映射到键为 (url, day) 和值 1L 的元组,您可以这样做:

    result = myRDD
        .values()
        .mapToPair(viewRecord -> {
            String url = viewRecord.getUrl();
            long day = viewRecord.getDay();
            return new Tuple2<>(new Tuple2<>(url, day), 1L);
        })
    
    
    //java 7 style
    JavaPairRDD<Pair, Long> result = myRDD
            .values()
            .mapToPair(new PairFunction<ViewRecord, Pair, Long>() {
                           @Override
                           public Tuple2<Pair, Long> call(ViewRecord record) throws Exception {
                               String url = record.getUrl();
                               Long day = record.getDay();
    
                               return new Tuple2<>(new Pair(url, day), 1L);
                           }
                       }
            ); 
    

    【讨论】:

    • 我在我的问题中添加了原始元组类。由于我当前的语言级别不支持 lambda 表达式,您能否提供一个 Java 7 风格的示例?
    • @kamaci 我添加了 Java 7 版本。
    • 我已经这样实现了: JavaRDD> result = myRDD.values().map( new Function>() { @Override public Tuple2 call(ViewRecord viewRecord) throws Exception { String url = viewRecord.getUrl(); long day = viewRecord.getDay(); return new Tuple2(url, day); } }) ;我找不到你提到的 Pair 和 Record 类。我的函数编译但它抛出一个错误:SparkException: Task not serializable 但似乎这是另一个问题。
    • 好吧,我猜这是我的糟糕记录,而 Pair 是我的虚拟课程。相反,您应该使用 ViewRecord 类。在 spark 中,您在 rdds 中使用的所有类都必须是可序列化的,因为 spark 默认使用 java 序列化在节点之间移动对象。作为对,您可以使用例如标准火花对类 Tuple2 它是通用的可序列化类。更大的问题是如果您的 ViewRecord 不可序列化。在这种情况下,您可能必须使用一些自定义序列化。顺便说一句,驱动程序也必须是可序列化的。
    • 我会接受你的回答并开始一个关于我的问题的新线程。
    猜你喜欢
    • 1970-01-01
    • 2016-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多