如何基于Java中的特定字段值过滤Spark RDD?

时间:2015-07-17 17:58:28

标签: java filter apache-spark

我正在用Java创建一个Spark作业。这是我的代码。

我正在尝试从CSV文件中过滤记录。标题包含字段OIDCOUNTRY_NAME,......

我希望更具体,而不仅仅是基于s.contains("CANADA")进行过滤,我想根据COUNTRY_NAME.equals("CANADA")进行过滤。 有关如何做到这一点的任何想法?

public static void main(String[] args) {
    String gaimFile = "hdfs://xx.yy.zz.com/sandbox/data/acc/mydata"; 

    SparkConf conf = new SparkConf().setAppName("Filter App");
    JavaSparkContext sc = new JavaSparkContext(conf);
    try{
        JavaRDD<String> gaimData = sc.textFile(gaimFile);

        JavaRDD<String> canadaOnly = gaimData.filter(new Function<String, Boolean>() {

            private static final long serialVersionUID = -4438640257249553509L;

            public Boolean call(String s) { 
               // My file id csv with header OID, COUNTRY_NAME, .....
               // here instead of just saying s.contains 
               // i would like to be more specific and say 
               // if COUNTRY_NAME.eqauls("CANADA)
               return s.contains("CANADA"); 
            }
        }); 

    }
    catch(Exception e){
        System.out.println("ERROR: G9 MatchUp Failed");
    }
    finally{
        sc.close();
    }
}

1 个答案:

答案 0 :(得分:3)

您必须先将您的值映射到自定义类:

rdd.map(lines=>ConvertToCountry(line))
   .filter(country=>country == "CANADA")

class Country{
  ...ctor that takes an array and fills properties...
  ...properties for each field from the csv...
}

ConvertToCountry(line: String){
  return new Country(line.split(','))
}

以上是Scala和伪代码的组合,但你应该明白这一点。