写在前面:一般来说spark都是由Scala来实现,但Java一手遮天,非要以一己之力实现(不是)
//往往文件都是根据配置文件修改的时间,动态获取对应的文件来处理
String filePath = "/租户目录/指标/指标分类/指标分类子分支" + startTime.substring(0, 6) + ".csv";
//通过调用JavaSparkContext的获取文本的方法获取数据
jsc.textFile(指标路径)
一般来说,想要使用JavaSparkContext,就要先定义一个JavaSparkContext的实例化对象
JavaSparkContext jsc = SparkConfig.Instance("自定义的名字");
(1)获取数据时一般会根据分隔符(比如逗号)将元素划分命名,如下:
使用mapToPair方法操作数据,先将数据按照逗号分割成两部分,给到二元组Tuple2
jsc.textFile(filePath).mapToPair(new PairFunction<String, String, String>() {
@Override
public Tuple2<String, String> call(String t) throws Exception {
String[] split = t.split(",", -1);
return new Tuple2<>(split[0],split[1]);
}
})
(2)具体实际使用中,我们将结果返回一个JavaPairRDD
JavaPairRDD<String, String> 自定义数据名称= jsc.textFile(filePath).mapToPair(new PairFunction<String, String, String>() {
@Override
public Tuple2<String, String> call(String t) throws Exception {
String[] split = t.split(",", -1);
return new Tuple2<>(split[0],split[1]);
}
}).persist(StorageLevel.MEMORY_AND_DISK());
以此类推,可以定义好几个这样的JavaPairRDD
来暂时存储数据,有了这些数据,就可以进行Join等操作
除了直接使用,还可以把获取字段定义成一种方法,例如:
public static JavaPairRDD<String, String> get字段1字段2(JavaSparkContext jsc, String 字段1字段2) {
JavaPairRDD<String, String> imsiAttr = jsc.textFile(filePath).mapToPair(new PairFunction<String, String, String>() {
@Override
public Tuple2<String, String> call(String s) throws Exception {
String 字段1= s.split(",", -1)[0];
String 字段2= s.split(",", -1)[1];
return new Tuple2<>(字段1, 字段2);
}
});
return 字段1字段2;
}
这样使用的时候就可以直接调用 get字段1字段2方法获取 字段1字段2
JavaPairRDD<String, String> 字段1字段2= get1_2(jsc, filePath);
注:在命名和使用中,往往会将一些字段的csv文件路径存为公参,比如
在公参文件中写
public static final String 字段1字段2= 租户目录 + "配置目录/字段1_字段2.csv";
然后再获取字段1字段2所对应的文件路径
String imsiattr = GetFilePathUtils.字段1字段2;
这样一来,实际使用中的代码就是:
String 字段1字段2= GetFilePathUtils.字段1字段2;
JavaPairRDD<String, String> 字段1字段2= get1_2(jsc, 字段1字段2).persist(StorageLevel.MEMORY_AND_DISK());
一般为了提高代码的复用性,会将对数据的常用操作写成一个函数方法来调用,其中包含了很多的函数,具体常用的如下:
groupByKey
leftOuterJoin
mapToPair
flatMapToPair
reduceByKey
map
filter
通过合理的使用这些函数,实现分步骤处理数据,逐步筛选最终得到想要的数据结果的目的