我正在用Java创建一个Spark作业。这是我的代码。
我正在尝试从CSV文件中过滤记录。标题包含字段OID
,COUNTRY_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();
}
}
答案 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和伪代码的组合,但你应该明白这一点。