map是什么意思(到处是map、flatMap,啥意思?)( 二 )


以上的描述也不尽然,比如python的map,执行后就可以输出结果 。这让人很没面子啊 。
map & reduce
谈到map和reduce,大家就不约而同的想到了hadoop 。然而,它不仅仅是大数据中的概念 。
对于它俩的概念,我们仅做下面两行介绍 。
map
将传入的函数依次作用到序列的每个元素,并把结果作为新的数组流返回 。
reduce
reduce类似于一个递归的概念 。最终会归约成一个值 。看看这个公式:)
reduce([p1,p2,p3,p4],fn) = reduce([fn(p2,p4),fn(p1,p3)])具体还是看谷歌的经典论文吧 。
《MapReduce: Simplified Data
Processing on Large Clusters》
https://ai.google/research/pubs/pub62
你能访问么?:)
map & flatMap
【map是什么意思(到处是map、flatMap,啥意思?)】这两个函数经常被使用 。它们有如下区别:
map
把数组流中的每一个值,使用所提供的函数执行一遍,一一对应 。得到元素个数相同的数组流 。
map是什么意思(到处是map、flatMap,啥意思?)
文章图片


flatMap
flat是扁平的意思 。它把数组流中的每一个值,使用所提供的函数执行一遍,一一对应 。得到元素相同的数组流 。只不过,里面的元素也是一个子数组流 。把这些子数组合并成一个数组以后,元素个数大概率会和原数组流的个数不同 。
map是什么意思(到处是map、flatMap,啥意思?)
文章图片


程序员们的表演java8种的Stream
java8开始,加入了一个新的抽象,一个称之为流的东西:Stream 。配合lambda语法,可以使代码变的特别的清爽、干净(有木有发现都快成了Scala了) 。
一个非常好的向导:
https://stackify.com/streams-guide-java-8/
Spark的RDD操作
spark的核心数据模型就是RDD,是一个有向无环图 。它代表一个不可变、可分区、其内元素可并行计算的集合 。
它是分布式的,但我们可以看下一个WordCount的例子 。
JavaRDD<String> textFile = sc.textFile("hdfs://...");JavaPairRDD<String, Integer> counts = textFile .flatMap(s -> Arrays.asList(s.split(" ")).iterator()) .mapToPair(word -> new Tuple2<>(word, 1)) .reduceByKey((a, b) -> a + b);counts.saveAsTextFile("hdfs://...");多么熟悉的Api啊,你一定在Hadoop里见过 。
Flink 的 DataStream
Flink程序是执行分布式集合转换(例如,filtering, mapping, updating state, joining, grouping, defining windows, aggregating)的常规程序 。Flink中的DataStream程序是实现在数据流上的transformation 。
我们同样看一下它的一段代码 。
DataStream<Tuple2<String, Integer>> counts =// split up the lines in pairs (2-tuples) containing: (word,1)text.flatMap(new Tokenizer())// group by the tuple field "0" and sum up tuple field "1".keyBy(0).sum(1);kafka stream的操作
kafka已经变成了一个分布式的流式计算平台 。他抽象出一个KStream和KTable,与Spark的RDD类似,也有类似的操作 。
KStream可以看作是KTable的更新日志(changlog),数据流中的每一个记录对应数据库中的每一次更新 。
我们来看下它的一段代码 。
KTable<String, Long> wordCounts = textLines.flatMapValues(value -> Arrays.asList(value.toLowerCase().split("\\W+"))).groupBy((key, value) -> value).count();wordCounts.toStream().to("streams-wordcount-output", Produced.with(stringSerde, longSerde));