sprark
RDD编程 Resilient Distributed Dataset 分布式的元素集合
1.创建RDD
2.转化已有RDD
3.调用RDD操作进行求值
4.Spark会自动将RDD中的数据分发到集群上,将操作并行化执行。
两种创建RDD的方法:
1.读取一个外部数据集
2.在驱动器程序里分发驱动器程序中的对象集合,比如list和set
创建出来后,RDD支持两种类型的操作:
1.转化操作cur RDD->new RDD ,比如filter()
2.行动操作 对RDD计算结果,把结果返回到驱动器程序中,或把结果存储到外部存储系统,比如HDFS
Spark Maven:
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.12</artifactId>
<version>2.4.1</version>
</dependency>
两种创建RDD的方法DEMO:
package demo;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import java.util.Arrays;
/**
* Created by Main on 2019/4/20.
*/
public class HelloJavaSpark {
public static void main(String[] args) {
//JavaSparkContext 对象代表和一个集群的连接 Driver programs通过SparkContext对象访问spark
SparkConf conf = new SparkConf().setMaster("local").setAppName("MyApp");
JavaSparkContext sc = new JavaSparkContext(conf);
//a获取数据集 在驱动器程序里分发驱动器程序中的对象集合
JavaRDD<Integer> disData = sc.parallelize(Arrays.asList(1,2,3,4,5));
//转化操作 生成新的RDDS
JavaRDD<Integer> otherData = disData.filter(x->x==3);
//执行操作
System.out.println(otherData.count());
//取出Rdds里面的部分数据
//task 或者 collect()都能取出数据
//通常不用 task collect 而是把数据存在HDFS 分布式存储系统中
for (Integer integer : otherData.collect()){
System.out.println(integer);
}
//a读取一个外部数据集
JavaRDD<String> textData = sc.textFile("C:/Users/Main/Desktop/README.md");
System.out.println("result:"+textData.first());
}
}
Map和filter的DEMO:
Map:将函数应用于RDD中的每个元素,将返回值构成新的RDD
filter:返回一个通过传给filter()的函数的元素组成的RDD
package demo;
import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import java.util.Arrays;
/**
* Created by Main on 2019/4/20.
*/
public class MapFilter {
public static void main(String[] args) {
//JavaSparkContext 对象代表和一个集群的连接 Driver programs通过SparkContext对象访问spark
SparkConf conf = new SparkConf().setMaster("local").setAppName("MyApp");
JavaSparkContext sc = new JavaSparkContext(conf);
//a获取数据集 在驱动器程序里分发驱动器程序中的对象集合
JavaRDD<Integer> disData = sc.parallelize(Arrays.asList(1,2,3,4,5));
JavaRDD<Integer> mappedRdd = disData.map(x->x*x);
JavaRDD<Integer> filteredRdd = disData.filter(x->x!=1);
for(Integer integer:mappedRdd.collect()){
System.out.println(integer);
}
filteredRdd.collect().forEach(item-> System.out.println(item));
}
}
flatMap的DEMO:
将函数应用于RDD中的每个元素,将返回的迭代器的所有内容构成新的RDD。通常用来切分单词。
package demo;
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 scala.Tuple2;
import java.util.*;
/**
* Created by Main on 2019/4/20.
*/
public class WordCount {
public static void main(String[] args) {
SparkConf conf = new SparkConf().setMaster("local").setAppName("MyApp");
JavaSparkContext sc = new JavaSparkContext(conf);
JavaRDD<String> lines = sc.textFile("C:/Users/Main/Desktop/README.md");
JavaRDD<String> words = lines.flatMap(line->Arrays.asList(line.split(" ")).iterator());
JavaPairRDD counts = words.mapToPair(w->new Tuple2(w,1)).reduceByKey((x,y)-> (Integer)x + (Integer)y);
counts.saveAsTextFile("C:/Users/Main/Desktop/helloSpark");
}
}
其他转化操作:distinct(),sample(),union(),intersectiom(),subtract(),cartesian()