掌握这项Java技能,你也可以吹一吹大数据处理了(二)

本文涉及的产品
云原生大数据计算服务 MaxCompute,5000CU*H 100GB 3个月
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
简介: 大家好,我是指北君,在如今的大数据时代,对于数据的生产线式的加工处理场景越来越多,Java8之前对于这种类型的数据处理是显得有些笨拙的,代码繁多臃肿(过多的中间过程变量和过程),显得不够优雅和简洁。在Java8引入Stream包后,我们就可以得心应手地应付这种场景。

5.通过generate生成30.png


按照提供给generate的Supplier逻辑生成数据,通过limit限制生成的数据量


6. 通过Stream.iterate创建


31.png

iterate提供两种方法来满足我们比较常用的迭代生成逻辑

  • iterate(final T seed, final UnaryOperatorf)
  • iterate(T seed, Predicate<? super T> hasNext, UnaryOperatornext)


7. 原生类型生成 通过对应的IntStream,LongStream,DoubleStream类中提供的方法来获取,包含常用的方法

  • builder()
  • empty()
  • of()
  • iterate()
  • generate()
  • range()
  • concat()


  1. 其他地方 这里介绍两处:字符分割匹配和文件行数据

String.chars()返回IntStream

Files.lines()返回通过行分割的字符内容


流的使用机制(重要事项)


我们通过上面的方法创建好流后,就可以对流进行相关的业务逻辑处理了,需要注意:如果我们重复对一个流进行操作,就会出错,系统会爆出IllegalStateException异常,这是因为Stream设计为不可重用的模式。流的下一个环节都是对当前环节处理后新生成流的处理。


流的执行顺序

采用Stream方式进行多个逻辑处理时,他们之间的执行顺序是什么样的呢?指北君为了展示效果,写了一段测试代码:

32.png

执行结果如下:

filter() was called: data_1

filter() was called: data_2

map() was called: data_2

forEach() was called: data_2

filter() was called: data_3

filter() was called: data_12

map() was called: data_12

forEach() was called: data_12

从示例代码的打印的顺序中我们可以发现:流处理的顺序不是以代码顺序(执行完一步再到下一步),而是按照数据处理完一个单位数据的所有环节再处理下一个数据,见下面的动态示意图:


33.gif                                                           Stream处理顺序

既然我们了解流的处理顺序,也能理解某些流操作会提前结束流处理的,比如findFirst(),在处理完第一个符合条件的数据后,后续的数据不会参与任何一个环节的处理。


转换处理


转换处理时最常用的逻辑处理方式,介绍转换处理的文章较多,这里不再一一详细描述只是简单列一下,转换处理对应大数据MapReduce中的Map处理

  1. distinct剔重
  2. filter过滤
  3. map转换映射
  4. peek
  5. limit
  6. skip


合并处理(reduce)


对于Map-Reduce模型的reduce操作,国内对这个词翻译不太统一,指北君就先称之为合并处理吧。这里介绍两个方法reduce和collect

  1. reduce 先来看一个reduce的示例


34.png

合并Stream中的所有值,合并的初始值为0,如果初始为0还可以省略初始值。reduce函数包含三部分关键信息:

  • 初始值,指定合并操作的初始值
  • 合并函数
  • 合路器(函数),在并行(多线程)运算时需要用到

下面是一个使用合路器的示例,在并行运算时使用。

35.png

这里指北君留一道思考题给大家,如果这里初始值0修改为10,最终的结果是多少?为什么是这种结果呢?

  1. collect 现在我们再来看collect,collect严格上说是reduce有些牵强,因为是否reduce在于collect中的执行逻辑 比如这段:

36.png然后再看下面的例子:

37.png

还有其他对应的方法:

  • Collectors.averagingInt
  • Collectors.summingInt
  • Collectors.groupingBy
  • Collectors.partitioningBy

各位小伙伴可以查看Collectors对应的API,这里就不一一列举了,总之,collect通过Collectors对象的API类完成合并处理。


总结


关于Java的Stream的常用知识指北君就给大家分享到这,相关的重点知识都有提及,但未太深入剖析,比如Stream的并发处理是如何执行的等等,这些知识点留待后续指北君为大家分享。

最后感谢各位人才的:点赞、收藏和评论,我们下期更精彩!

相关实践学习
基于MaxCompute的热门话题分析
本实验围绕社交用户发布的文章做了详尽的分析,通过分析能得到用户群体年龄分布,性别分布,地理位置分布,以及热门话题的热度。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps&nbsp;
相关文章
|
24天前
|
分布式计算 Java MaxCompute
ODPS MR节点跑graph连通分量计算代码报错java heap space如何解决
任务启动命令:jar -resources odps-graph-connect-family-2.0-SNAPSHOT.jar -classpath ./odps-graph-connect-family-2.0-SNAPSHOT.jar ConnectFamily 若是设置参数该如何设置
|
1月前
|
缓存 NoSQL Java
大数据-50 Redis 分布式锁 乐观锁 Watch SETNX Lua Redisson分布式锁 Java实现分布式锁
大数据-50 Redis 分布式锁 乐观锁 Watch SETNX Lua Redisson分布式锁 Java实现分布式锁
61 3
大数据-50 Redis 分布式锁 乐观锁 Watch SETNX Lua Redisson分布式锁 Java实现分布式锁
|
1月前
|
分布式计算 大数据 Java
大数据-86 Spark 集群 WordCount 用 Scala & Java 调用Spark 编译并打包上传运行 梦开始的地方
大数据-86 Spark 集群 WordCount 用 Scala & Java 调用Spark 编译并打包上传运行 梦开始的地方
26 1
大数据-86 Spark 集群 WordCount 用 Scala & Java 调用Spark 编译并打包上传运行 梦开始的地方
|
29天前
|
缓存 前端开发 JavaScript
9大高性能优化经验总结,Java高级岗必备技能,强烈建议收藏
关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。本文介绍了9种性能优化方法,涵盖代码优化、数据库优化、连接池调优、架构层面优化、分布式缓存、异步化、Web前端优化、服务化、硬件升级、搜索引擎和产品逻辑优化。欢迎留言交流。
|
1月前
|
消息中间件 分布式计算 Java
大数据-73 Kafka 高级特性 稳定性-事务 相关配置 事务操作Java 幂等性 仅一次发送
大数据-73 Kafka 高级特性 稳定性-事务 相关配置 事务操作Java 幂等性 仅一次发送
31 2
|
1月前
|
消息中间件 存储 Java
大数据-58 Kafka 高级特性 消息发送02-自定义序列化器、自定义分区器 Java代码实现
大数据-58 Kafka 高级特性 消息发送02-自定义序列化器、自定义分区器 Java代码实现
46 3
|
1月前
|
分布式计算 资源调度 Hadoop
大数据-01-基础环境搭建 超详细 Hadoop Java 环境变量 3节点云服务器 2C4G XML 集群配置 HDFS Yarn MapRedece
大数据-01-基础环境搭建 超详细 Hadoop Java 环境变量 3节点云服务器 2C4G XML 集群配置 HDFS Yarn MapRedece
79 4
|
1月前
|
分布式计算 Java 大数据
大数据-147 Apache Kudu 常用 Java API 增删改查
大数据-147 Apache Kudu 常用 Java API 增删改查
33 1
|
1月前
|
消息中间件 Java 大数据
大数据-56 Kafka SpringBoot与Kafka 基础简单配置和使用 Java代码 POM文件
大数据-56 Kafka SpringBoot与Kafka 基础简单配置和使用 Java代码 POM文件
70 2
|
27天前
|
存储 Java
在Java编程的世界里,标识符命名是一项基础且至关重要的技能
在Java编程的世界里,标识符命名是一项基础且至关重要的技能
12 0
下一篇
无影云桌面