赞
踩
目录
"数据去重"主要是为了掌握和利用并行化思想来对数据进行有意义的筛选。统计大数据集上的数据种类个数、从网站日志中计算访问地等这些看似庞杂的任务都会涉及数据去重。
对数据文件中的数据进行去重。数据文件中的每行都是一个数据。样例输入如下所示:
1)file1:
2012-3-1 a
2012-3-2 b
2012-3-3 c
2012-3-4 d
2012-3-5 a
2012-3-6 b
2012-3-7 c
2012-3-3 c
2)file2:
2012-3-1 b
2012-3-2 a
2012-3-3 b
2012-3-4 d
2012-3-5 a
2012-3-6 c
2012-3-7 d
2012-3-3 c
样例输出如下所示:
2012-3-1 a
2012-3-1 b
2012-3-2 a
2012-3-2 b
2012-3-3 b
2012-3-3 c
2012-3-4 d
2012-3-5 a
2012-3-6 b
2012-3-6 c
2012-3-7 c
- public class Deduplicate {
- public static void main(String[] args){
- //todo:1、构建sparkconf,设置配置信息
- SparkConf conf = new SparkConf().setAppName("Deduplicated Application").setMaster("local[2]");;
- //todo:2、构建java版的sparkContext
- JavaSparkContext sc = new JavaSparkContext(conf);
- //todo:3、读取数据文件
- JavaRDD<String> dataRDD1 = sc.textFile("data/data1.txt");
- JavaRDD<String> dataRDD2 = sc.textFile("data/data2.txt");
- //todo:4、合并数据集
- JavaRDD<String> dataRDD = dataRDD1.union(dataRDD2);
- //todo:5、生成<值、" ">键值对
- JavaPairRDD<String,String> map =dataRDD.mapToPair(
- new PairFunction<String, String, String>() {
- public Tuple2<String, String> call(String s) throws Exception {
- return new Tuple2<String,String >(s,"");
- //获取数值作为key,空串作为value
- }
- }
- );
- //todo:6、通过合并键去重
- JavaPairRDD<String,String> result = map.reduceByKey(
- new Function2<String, String, String>() {
- @Override
- public String call(String s, String s2) throws Exception {
- return s2;
- }
- }
- );
- //todo:7、输出
- Object[] array = result.collect().toArray();
- for (Object o : array) {
- Tuple2<String,String> tuple2 = (Tuple2<String,String>) o;
- System.out.println(tuple2._1);
- }
- }
- }
"数据排序"是许多实际任务执行时要完成的第一项工作,比如学生成绩评比、数据建立索引等。这个实例和数据去重类似,都是先对原始数据进行初步处理,为进一步的数据操作打好基础。下面进入这个示例。
对输入文件中数据进行排序。输入文件中的每行内容均为一个数字,即一个数据。要求在输出中每行有两个间隔的数字,其中,第一个代表原始数据在原始数据集中的位次,第二个代表原始数据。
样例输入:
1)file1:
2
32
654
32
15
756
65223
2)file2:
5956
22
650
92
3)file3:
26
54
6
样例输出:
1 2
2 6
3 15
4 22
5 26
6 32
7 32
8 54
9 92
10 650
11 654
12 756
13 5956
14 65223
- /**
- * @Author: xuliushen
- * @Description:
- * @Date Created in 2021-09-07 16:00
- * @Modified by :
- */
- public class Rank {
- public static void main(String[] args){
- //todo:1、构建sparkconf,设置配置信息
- SparkConf conf = new SparkConf().setAppName("DataRank Application").setMaster("local[2]");;
- //todo:2、构建java版的sparkContext
- JavaSparkContext sc = new JavaSparkContext(conf);
- //todo:3、读取数据文件
- JavaRDD<String> dataRDD1 = sc.textFile("data/file1.txt");
- JavaRDD<String> dataRDD2 = sc.textFile("data/file2.txt");
- JavaRDD<String> dataRDD3 = sc.textFile("data/file3.txt");
- //todo:4、合并数据集
- JavaRDD<String> dataRDD = dataRDD1.union(dataRDD2).union(dataRDD3);
- //todo:5、生成<值、" ">键值对
- JavaPairRDD<Integer,String> map =dataRDD.mapToPair(
- new PairFunction<String, Integer, String>() {
- public Tuple2<Integer, String> call(String s) throws Exception {
- return new Tuple2<Integer,String >(Integer.parseInt(s)," ");
- //获取数值作为key,空串作为value
- }
- }
- );
- //todo:6、进行排序
- JavaPairRDD<Integer,String> result = map.sortByKey();
- //todo:7、转换成Array并输出
- Object[] array = result.collect().toArray();
- for (int i = 0; i < array.length; i++) {
- Tuple2<Integer,String> tuple2 = (Tuple2<Integer,String>) array[i];
- System.out.println(i+1+" "+ tuple2._1);
- }
- }
- }
"平均成绩"主要目的还是在重温经典"WordCount"例子,可以说是在基础上的微变化版,该实例主要就是实现一个计算学生平均成绩的例子。
对输入文件中数据进行就算学生平均成绩。输入文件中的每行内容均为一个学生的姓名和他相应的成绩,如果有多门学科,则每门学科为一个文件。要求在输出中每行有两个间隔的数据,其中,第一个代表学生的姓名,第二个代表其平均成绩。
样本输入:
1)math:
张三 88
李四 99
王五 66
赵六 77
2)china:
张三 78
李四 89
王五 96
赵六 67
3)english:
张三 80
李四 82
王五 84
赵六 86
样本输出:
张三 82
李四 90
王五 82
赵六 76
- /**
- * @Author: xuliushen
- * @Description:
- * @Date Created in 2021-09-07 14:39
- * @Modified by :
- */
- public class Average {
- public static void main(String args[]) {
- //todo:1、构建sparkconf,设置配置信息
- SparkConf conf = new SparkConf().setAppName("Average Application").setMaster("local[2]");;
- //todo:2、构建java版的sparkContext
- JavaSparkContext sc = new JavaSparkContext(conf);
- //todo:3、读取数据文件
- JavaRDD<String> dataRDD1 = sc.textFile("data/math.txt");
- JavaRDD<String> dataRDD2 = sc.textFile("data/china.txt");
- JavaRDD<String> dataRDD3 = sc.textFile("data/english.txt");
- //todo:4、合并数据集
- JavaRDD<String> lines = dataRDD1.union(dataRDD2).union(dataRDD3);
- //todo:5、每一行转化为键值对
- JavaPairRDD<String,Integer> map =lines.mapToPair(
- new PairFunction<String, String, Integer>() {
- public Tuple2<String, Integer> call(String s) throws Exception {
- String[] line = s.split(" ");
- return new Tuple2<String,Integer >(line[0],Integer.parseInt(line[1]));
- //获取第一个单词作为key,第二个转化为Long作为value
- }
- }
- );
-
- JavaPairRDD<String, Tuple2<Integer, Integer>> data3 = map.mapValues(
- x -> new Tuple2<Integer, Integer>(x, 1));
-
- JavaPairRDD<String, Tuple2<Integer, Integer>> data4 = data3.reduceByKey((x, y) -> {
- return new Tuple2<Integer, Integer>(x._1 + y._1, x._2 + y._2);
- });
-
- JavaPairRDD<String, Integer> data5 = data4.mapToPair(x -> {
- return new Tuple2<String, Integer>(x._1, x._2._1 / x._2._2);
- });
-
- //todo:6、输出数据
- System.out.println(data5.collect());
- }
- }
前面的实例都是在数据上进行一些简单的处理,为进一步的操作打基础。"单表关联"这个实例要求从给出的数据中寻找所关心的数据,它是对原始数据所包含信息的挖掘。下面进入这个实例。
实例中给出child-parent(孩子—父母)表,要求输出grandchild-grandparent(孙子—爷奶)表。样例输入如下所示。
file:
child parent
Tom Lucy
Tom Jack
Jone Lucy
Jone Jack
Lucy Mary
Lucy Ben
Jack Alice
Jack Jesse
Terry Alice
Terry Jesse
Philip Terry
Philip Alma
Mark Terry
Mark Alma
家族树状关系谱:
图4.2-1 家族谱
样例输出如下所示。
file:
grandchild grandparent
Tom Alice
Tom Jesse
Jone Alice
Jone Jesse
Tom Mary
Tom Ben
Jone Mary
Jone Ben
Philip Alice
Philip Jesse
Mark Alice
Mark Jesse
- /**
- * @Author: xuliushen
- * @Description:
- * @Date Created in 2021-09-07 20:46
- * @Modified by :
- */
- public class SingleRelation {
- public static void main(String[] args){
- //todo:1、构建sparkconf,设置配置信息
- SparkConf conf = new SparkConf().setAppName("SingleRelation Application").setMaster("local[2]");;
- //todo:2、构建java版的sparkContext
- JavaSparkContext sc = new JavaSparkContext(conf);
- //todo:3、读取数据文件
- JavaRDD<String> dataRDD= sc.textFile("data/relation.txt");
- //去掉第一行
- Object[] array = dataRDD.collect().toArray();
- List list = Arrays.asList(array);
- list = list.subList(1,list.size());//去掉
- dataRDD = sc.parallelize(list);
- //todo:4、把每一行映射成为键值对
- //键值对<child,parent>
- JavaPairRDD<String,String> map1 =dataRDD.mapToPair(
- new PairFunction<String, String, String>() {
- public Tuple2<String, String> call(String s) throws Exception {
- String[] line = s.split(" ");
- return new Tuple2<String,String>(line[0],"0"+line[1]);//0表示为父亲
- //获取第一个单词作为key,第二个转化为Long作为value
- }
- }
- );
- //键值对<parent,child>
- JavaPairRDD<String,String> map2 =dataRDD.mapToPair(
- new PairFunction<String, String, String>() {
- public Tuple2<String, String> call(String s) throws Exception {
- String[] line = s.split(" ");
- return new Tuple2<String,String>(line[1],"1"+line[0]);//1表示为孩子
- //获取第一个单词作为key,第二个转化为Long作为value
- }
- }
- );
- //todo:5、合并
- JavaPairRDD<String,String> map = map1.union(map2);
- //todo:6、根据键建立祖孙联系
- JavaPairRDD<String,String> data1 = map.reduceByKey(
- new Function2<String, String, String>() {
- @Override
- public String call(String s, String s2) throws Exception {
- return s+" "+s2;
- }
- }
- );
-
- //todo:7、输出
- System.out.println("grandchild grandparent");
- Object[] data2 = data1.collect().toArray();
- for (Object o : data2) {
- String relation =((Tuple2<String,String>)o)._2;//取出关系字符串
- String[] relations = relation.split(" ");
- List<String> fathers = new ArrayList<>();
- List<String> childs = new ArrayList<>();
- int i = 0;
- for (String s : relations) {
- if(s.charAt(0) == '0'){//父亲
- fathers.add(s.substring(1));
- }else{//孩子
- childs.add(s.substring(1));
- }
- }
- if(fathers.size()!=0 && childs.size()!=0){
- for (String child : childs) {
- for (String father : fathers) {
- System.out.println(child+" "+father);
- }
- }
- }
- }
-
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。