RDD操作

来源:互联网 发布:算法的概念数学 编辑:程序博客网 时间:2024/04/28 00:26

RDD支持两种操作:转化操作和行动操作,转化操作是返回一个新的RDD的操作比如map()和filter(),行动操作则是向驱动器程序返回结果或把结果写入外部系统的操作,会触发实际的计算比如count(),first(),简而言之就是转化操作返回的是RDD,而行动操作返回的是其他数据类型,下面来一个转化操作的列子:

文本文件内容

现在遍历文本文件,选出里面含error的错误日志:
/** * Created by hbin on 2016/12/9. */import java.util.Arrays;import java.util.List;import breeze.optimize.linear.LinearProgram;import io.netty.util.internal.StringUtil;import org.apache.commons.lang.StringUtils;import org.apache.spark.SparkConf;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;/** * spark对数据的核心抽象  RDD(弹性分布式数据集) * RDD就是分布式的元素集合,在spark中对数据的所有操作不外乎创建RDD * 转化已有RDD以及调用RDD操作进行求值,spark会自动将RDD中的数据分发到集群上, * 并将操作并行化 */public class BasicMap {    public static void main(String[] args) throws Exception {        SparkConf sparkConf = new SparkConf().setAppName("JavaSparkPi");        JavaSparkContext jsc = new JavaSparkContext(sparkConf);        JavaRDD<String> inputRDD=jsc.textFile("E:\\sparkProject\\log.txt");        JavaRDD<String> errorsRDD=inputRDD.filter(new Function<String, Boolean>() {            @Override            public Boolean call(String s) throws Exception {                return s.contains("error");            }        });        System.out.println("errorsRDD="+errorsRDD.collect());    }}
执行结果:
errorsRDD=[error:, error:, error:, error:, error:, error:, error:, error:, error:, error:, error:, error:, error:, error:]
日志分析过程中创建出的RDD谱系图

spark中的RDD就是一个不可变的分布式对象集合,每个RDD都被分为多个分区,这些分区运行在集群中的不同节点上。RDD可以包含python,Java,Scala中的任意类型的对象。
RDD中的行动操作

/** * Created by hbin on 2016/12/9. */import java.io.Serializable;import java.util.Arrays;import java.util.List;import breeze.optimize.linear.LinearProgram;import io.netty.util.internal.StringUtil;import org.apache.commons.lang.StringUtils;import org.apache.spark.SparkConf;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;/** * spark对数据的核心抽象  RDD(弹性分布式数据集) * RDD就是分布式的元素集合,在spark中对数据的所有操作不外乎创建RDD * 转化已有RDD以及调用RDD操作进行求值,spark会自动将RDD中的数据分发到集群上, * 并将操作并行化 */public class BasicMap {    public static void main(String[] args) throws Exception {        SparkConf sparkConf = new SparkConf().setAppName("JavaSparkPi");        JavaSparkContext jsc = new JavaSparkContext(sparkConf);        JavaRDD<Integer> RDD1=jsc.parallelize(Arrays.asList(1,2,3,4,5,6,7,8,9),6);// 并行化        Integer sum=RDD1.reduce(new Function2<Integer, Integer, Integer>() {            @Override            public Integer call(Integer x, Integer y) throws Exception {                return x*y;            }        });        System.out.println("collect()="+RDD1.collect());        System.out.println("count()="+RDD1.count());        System.out.println("countByValue()="+RDD1.countByValue());        System.out.println("take(3)="+RDD1.take(3));        System.out.println("top()="+RDD1.top(3));        System.out.println("takeOrdered(3)="+RDD1.takeOrdered(3));        System.out.println("takeSample(true,3)="+RDD1.takeSample(true,3));    }}

执行结果
collect()=[1, 2, 3, 4, 5, 6, 7, 8, 9]
count()=9
countByValue()={5=1, 1=1, 6=1, 9=1, 2=1, 7=1, 3=1, 8=1, 4=1}
take(3)=[1, 2, 3]
top()=[9, 8, 7]
takeOrdered(3)=[1, 2, 3]
takeSample(true,3)=[2, 6, 5]
0 0
原创粉丝点击