spark学习笔记:flatMap()(API操作报错)

来源:互联网 发布:云游seo 编辑:程序博客网 时间:2024/06/07 17:07

适用版本2.2

scala

以本地模式进入spark-shell:

spark-shell --master local[4]

下载Fast Data Processing with Spark 2nd Edition一书中第二章用到的数据集spam.data,此数据集内全是由空格分隔的浮点数:
https://github.com/xsankar/fdps-vii/tree/master/data

加载此文件并计算行数:

val rdd=sc.textFile("/home/daya/shared_dir/spam.data");rdd.count

输出与VCCode统计结果一致:

对rdd的每行数据按空格切分得到新rdd2:

val rdd2 = rdd.map(line=>line.split(" "));

注意rdd是字符型数据集,而切分后的rdd2是数组型数据集:

再对rdd使用flatMap()方法,同样对每行按空格切分得到新rdd3:

val rdd3 = rdd.flatMap(line=>line.split(" "));

考察map()与flatMap()的差异:

不难看出这个例子中map()构造了 一个二维数组,每行是一个一维数组;而flatMap()则消除了行的概念,将所有元素全部构建到一个一维数组中,这被称作扁平化处理。

将字符数据集转换为浮点数据集:

val rdd4=rdd3.map(_.toDouble)

简单数字数据集常用的方法:

rdd4.count;//元素总数rdd4.sum;//元素总和rdd4.max;rdd4.min

Java

因为Java没有shell,所以打开eclipse新建Java类,代码如下:

package daya.sparkdemo;import java.util.Arrays;import java.util.Iterator;import java.util.List;import org.apache.spark.SparkConf;import org.apache.spark.SparkFiles;import org.apache.spark.api.java.JavaRDD;import org.apache.spark.api.java.JavaSparkContext;import org.apache.spark.api.java.function.FlatMapFunction;public class flatMapDemo {    public static void main( String[] args )    {        SparkConf conf =new SparkConf();        conf.setMaster("local[4]");        conf.setAppName("sparkdemo");        JavaSparkContext jsc=new JavaSparkContext(conf);        JavaRDD<String> jrdd=jsc.textFile("/home/daya/shared_dir/spam.data");        JavaRDD<String> jrdd2=jrdd.flatMap(new FlatMapFunction<String, String>() {            public Iterator<String> call(String item) throws Exception             {                return  (Iterator<String>) Arrays.asList(item.split(" "));            }        });        List<String> list=jrdd2.collect();        for(String item:list)        {            System.out.println(item);        }        jsc.close();    }}

运行报错,暂未解决:java.util.Arrays$ArrayList cannot be cast to java.util.Iterator

原创粉丝点击