spark core 开发2

spark中常用的算子:
map算子:
将原来RDD的每个数据项通过map中的用户自定义函数f映射转变为一个新的元素,途中每个方框表示一个RDD分区,左侧的分区经过用户自定义函数f 映射为右侧的新RDD分区,但是,实际只有等到action算子触发后,这个f函数才会和其他函数在一个stage中的数据进行运算
mapValues算子:
针对(key,value)型数据中的value进行map操作 而不对key进行处理 图中的方框代表RDD分区 a=>a+2 代表针对(V1,1)这样的Key value数据对,数据支队value中的1进行加2的操作
flatmap 算子
将原来R得到中的每个元素通过函数f转换为新的元素,并将生成的RDD的每个分区中多个集合中的元素合并为一个集合
mapPartition算子:
针对每一个分区 ,在函数中通过这个分区整体的迭代器对整个分区的元素进行操作
union算子: 取并集
需要保证两个RDD元素的数据类型相同,返回的RDD数据类型和被合并的RDD元素数据类型相同,并不进行去重操作,保存所有元素
**intersection算子:**取交集
该函数返回两个RDD的交集,并且去重
groupbykey算子:
在执行该算子之前,需要将元素通过函数生成相应的Key,数据就转化为key-value格式,之后利用该算子将Key相同的元素分为一组 可以指定最后生成多少个分区 groupbykey(x),x确定了分区个数和分区函数,决定了并行化的程度
在这里插入图片描述
Combinebykey : aggregateByKey foldByKey reduceByKey 等函数都是基于该函数实现的 相当于将元素为(int,int的rdd转变为了(int seq[int])类型元素的RDD)
(V1,2)
(V1,1)------>(V1,seq(2,1))
Reducebykey:
两个值合并成一个值,(int,int v)====>(int,intC)
通过用户自定义函数(A,B):(A+B)函数,将相同key的数据(v1,1),(v1,2)---->(v1,3)
aggregatebykey :
以分区为单位进行操作,aggregatebykey(初始值,函数1,函数2)
例:函数1定义的逻辑是求每个key的多个value的最大值,
函数2定义的逻辑是求和,
底层实现:
1.针对每一个分区内相同的key,一次比较初始值和v1,返回值和v2,返回值….直到获取到最大值
2.将不同分区得到的统计结果进行汇总,汇总的方式是将相同key的统计结果相加
Sortbykey:
按照key值排序
join算子:
对两个需要连接的RDD进行cogroup函数操作,将先相同key的数据能够放到同一个分区,在cogroup操作之后形成的新RDD对每个key下的元素进行笛卡尔积的操作,返回的结果再展平,对应key下的所有元祖形成一个集合,返回RDD[(K,(V,W))]
在这里插入图片描述
cogroup算子:
cogroup函数将两个RDD进行协同划分,对在两个RDD中的key-value类型的元素,每个RDD相同key的元素分别聚合为一个集合,并且返回两个RDD中对应key的元素集合的迭代器:(K,(Iterable[V],Iterable[W]))其中,value是两个RDD下相同key的两个数据集合的迭代器所构成的元祖
在这里插入图片描述
cartesian算子:
对两个RDD内的所有元素进行笛卡尔积操作
在这里插入图片描述
repartition算子:
对输入RDD重新分区
输出分区为输入分区子集
filter算子:
对元素进行过滤,返回值为boolen类型,true在RDD中保留,false将被过滤
Sample(false,0.001,20):
False:是否放回
0.001:概率
20:随机数种子
对于RDD中每个partition的数据按照抽样率进行抽样,并返回一个新的RDD
Takesample(action算子):
直接可以打印数据集

java开发:

package com.spark;

import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;

import org.apache.cassandra.cli.CliParser.newColumnFamily_return;
import org.apache.hadoop.hive.ql.parse.HiveParser_IdentifiersParser.intervalLiteral_return;
import org.apache.hadoop.hive.ql.parse.HiveParser_IdentifiersParser.nullCondition_return;
import org.apache.hadoop.ipc.RetriableException;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.FlatMapFunction;
import org.apache.spark.api.java.function.Function;
import org.apache.spark.api.java.function.Function2;
import org.netlib.blas.Srot;


public class RDDOperation {
	static String basedir = System.getProperty("user.dir"+File.separator+"conf"+File.separator);
	public static void main(String[] args) {
		SparkConf conf =new SparkConf().setAppName("RDDOperation").setMaster("local");
		JavaSparkContext sc = new JavaSparkContext(conf);
		mapDemo(sc);
		System.out.println("-------------");
		flatMapDemo(sc);
		System.out.println("-------------");
		filterDemo(sc);
		System.out.println("-------------");
		sampleDemo(sc);
		System.out.println("-------------");
		mapPartitionDemo(sc);
		System.out.println("-------------");
		groupByKeyDemo(sc);
		System.out.println("-------------");
		reduceByKeyDemo(sc);
		System.out.println("-------------");
			
		
		
	}
	
private static void mapDemo(JavaSparkContext sc) {
	List<String> list =Arrays.asList("hadoop hbase hdfs spark storm","java scala python");
	JavaRDD<String> stringRdd =sc.parallelize(list);//只有一个分区
//	[hadoop hbase hdfs spark storm, java scala python]
//	System.out.println(stringRdd.collect());
//	map函数把rdd中的每一个元素传进来  一个元素“hadoop hbase hdfs spark stormpoiup”
	JavaRDD<String[]>splitRdd =stringRdd.map(
			new Function<String,String[]>(){
				public static final long serialVersionUID=1L;
//				call方法会被反复调用
				public String[] call(String v1) {
					return v1.split(" ");
				}
	    
	});
	List<String[]> result =splitRdd.collect();
	for (int i = 0; i <result.size(); i++) {
		for(String s :result.get(i)) {
			System.out.println("Array"+i+"Data:"+ s);			
		}		
	}	
}

private static void flatMapDemo(JavaSparkContext sc) {
	List<List<String>> list =Arrays.asList(
			Arrays.asList("hadoop hbase hdfs spark storm","java scala python"),
			Arrays.asList("java scala python","beijing","zhejiang","shanghai"));
	JavaRDD<List<String>> stringRdd =sc.parallelize(list);
	JavaRDD<String>flatmapRdd=stringRdd.flatMap(
			new FlatMapFunction<List<String>, String>() {
				private static final long serialVersionUID=1L;
				List<String> list =new ArrayList<String>();
				String[] wordArr  = null;
				StringBuilder sb = new StringBuilder();
				@Override
				
				public Iterable<String> call(List<String> s) {
					for (int i =0;i<s.size();i++) {
						sb.append(s.get(i));
						sb.append(" ");
					}
				wordArr = sb.toString().split(" ");
				for (String word : wordArr) {
					list.add(word);
				}
				return list;					
					
			}					
		});
	    System.out.println("source data "+ stringRdd.collect());
	    System.out.println("flatmapoutput"+ flatmapRdd.collect());
	        
	
	
	
	
}
private static void filterDemo(JavaSparkContext sc) {
	List<String> list = Arrays.asList("hadoop hbase hdfs spark strom","java scala r");
	JavaRDD<String> stringRdd = sc.parallelize(list);
	JavaRDD<String> filterRDD = stringRdd.filter(
			new Function<String, Boolean>() 
			{
				private static final long servialVersionUID=1L;
				public Boolean call(String s) {
//					s 包含两个元素
					return s.contains("j");
//					返回“java scala r”  
					
				}
						
	});
	System.out.println(filterRDD.collect());
	
}
private static void mapPartitionDemo(JavaSparkContext sc) {
	List<Integer> list = Arrays.asList(1,2,3,4,5,6);
	JavaRDD<Integer> intRdd = sc.parallelize(list,2);
//	传进来的是一个一个分区
	JavaRDD<Integer> mapPartitionRdd = intRdd.mapPartitions(
		new FlatMapFunction<Iterator<Integer>, Integer>() {
		private static final long servialVersionUID=1L;
		public Iterable<Integer> call(Iterator<Integer> integerIterator) throws Exception {
			List<Integer> list =new ArrayList<>();
			while (integerIterator.hasNext()) {
				list.add(integerIterator.next());							
			}
			list.add(0);
			return list;
				
		}
	});
	System.out.println(mapPartitionRdd.collect());
	
}
private static void sampleDemo(JavaSparkContext sc) {
	List<Integer> list = new ArrayList<Integer>();
	for (int i = 0; i < 10000; i++) {
		list.add(i);
		
	}
	JavaRDD<Integer> intRdd= sc.parallelize(list);
//	是否放回采样   采样的概率   随机种子
	JavaRDD<Integer> sampleRdd = intRdd.sample(false, 0.001,20);
	System.out.println(sampleRdd.partitions().size());
	System.out.print(sampleRdd.collect());
	
	
}
private static void groupByKeyDemo(JavaSparkContext sc) {
	List<String> list =Arrays.asList("dog","tiger","lion","cat","spider","elephent");
	JavaPairRDD<Integer, String> pairRDD = sc.parallelize(list).keyBy(new Function<String, Integer>() {
		private static final long serialVersionUID=1L;
		public Integer call(String v1) {
			return v1.length();
			
		}		
		
	});
	JavaPairRDD<Integer, Iterable<String>> groupByPairRDD = pairRDD.groupByKey();
	System.out.println(groupByPairRDD.collect());
}
private static void reduceByKeyDemo(JavaSparkContext sc) {
	List<String> list = Arrays.asList("dog","cat","owl","gnu","ant");
	JavaPairRDD<Integer, String> pairRDD = sc.parallelize(list).keyBy(new Function<String, Integer>() {
		private static final long serialVersionUID=1L;
		public Integer call(String v1) {
			return v1.length();
//			返回 3,dog  3,cat....
		}
		
	});
//	
	JavaPairRDD<Integer, String> reduceByRdd = pairRDD.reduceByKey(
//			两个输入  一个输出
//			1.<k1,v1>中的v1  和  <k2,v2>中的v2   -----》 v1_v2
//			v1-v2 v3----》v1-v2-v3
			new Function2<String, String, String>() {
		
		@Override
	
		public String call(String v1, String v2) throws Exception {
			// TODO Auto-generated method stub
			return v1 + "-" + v2;
		}
	});
	System.out.print(reduceByRdd.collect());
}



}

发布了20 篇原创文章 · 获赞 23 · 访问量 992

猜你喜欢

转载自blog.csdn.net/surijing/article/details/104561172