经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » Spark » 查看文章
Spark WordCount的两种方式
来源:cnblogs  作者:大雄魔法师  时间:2019/1/4 9:12:22  对本文有异议

Spark WordCount的两种方式。

语言:Java

工具:Idea

项目:Java Maven

pom.xml如下:

  1. <properties>
  2. <spark.version>1.2.0</spark.version>
  3. </properties>
  4. <dependencies>
  5. <dependency>
  6. <groupId>org.apache.spark</groupId>
  7. <artifactId>spark-core_2.10</artifactId>
  8. <version>${spark.version}</version>
  9. </dependency>
  10. </dependencies>

第一种方式,比较常规的按部就班的

  1. package pairs;
  2. import org.apache.spark.SparkConf;
  3. import org.apache.spark.api.java.JavaPairRDD;
  4. import org.apache.spark.api.java.JavaRDD;
  5. import org.apache.spark.api.java.JavaSparkContext;
  6. import org.apache.spark.api.java.function.FlatMapFunction;
  7. import org.apache.spark.api.java.function.Function2;
  8. import org.apache.spark.api.java.function.PairFunction;
  9. import org.apache.spark.api.java.function.VoidFunction;
  10. import scala.Tuple2;
  11. import java.util.Arrays;
  12. public class WordCount1 {
  13. public static void main(String[] args) {
  14. SparkConf conf = new SparkConf().setMaster("local").setAppName("wordcount1");
  15. JavaSparkContext sc = new JavaSparkContext(conf);
  16. String filename = "D:\\tmp\\words.txt";
  17. JavaRDD<String> input = sc.textFile(filename);
  18. JavaRDD<String> lines = input.flatMap(new FlatMapFunction<String, String>() {
  19. public Iterable<String> call(String s) throws Exception {
  20. return Arrays.asList(s.split(" "));
  21. }
  22. });
  23. //pairs
  24. JavaPairRDD<String,Integer> pairs = lines.mapToPair(new PairFunction<String, String, Integer>() {
  25. public Tuple2<String, Integer> call(String s) throws Exception {
  26. return new Tuple2<String, Integer>(s,1);
  27. }
  28. });
  29. //reduce
  30. JavaPairRDD<String,Integer> counts = pairs.reduceByKey(new Function2<Integer, Integer, Integer>() {
  31. public Integer call(Integer x, Integer y) throws Exception {
  32. return x+y;
  33. }
  34. });
  35. //output
  36. counts.foreach(new VoidFunction<Tuple2<String, Integer>>() {
  37. public void call(Tuple2<String, Integer> tuple2) throws Exception {
  38. System.out.println(tuple2);
  39. }
  40. });
  41. sc.stop();
  42. }
  43. }

代码输出:

  1. (rose,2)
  2. (jack,3)

 

第二种更为简洁

  1. package pairs;
  2. import org.apache.spark.SparkConf;
  3. import org.apache.spark.api.java.JavaRDD;
  4. import org.apache.spark.api.java.JavaSparkContext;
  5. import org.apache.spark.api.java.function.FlatMapFunction;
  6. import java.util.Arrays;
  7. import java.util.Map;
  8. public class WordCount2 {
  9. public static void main(String[] args) {
  10. SparkConf conf = new SparkConf().setMaster("local").setAppName("wordcount2");
  11. JavaSparkContext sc = new JavaSparkContext(conf);
  12. String filename = "D:\\tmp\\words.txt";
  13. JavaRDD<String> input = sc.textFile(filename);
  14. JavaRDD<String> lines = input.flatMap(new FlatMapFunction<String, String>() {
  15. public Iterable<String> call(String s) throws Exception {
  16. return Arrays.asList(s.split(" "));
  17. }
  18. });
  19. Map<String,Long> result = lines.countByValue();
  20. System.out.println(result);
  21. sc.stop();
  22. }
  23. }

代码输出:

  1. {rose=2, jack=3}

通过对比可以发现,第一种方式一直都是转化操作,最后打印的是Tuple2;而第二种方式变成了行动操作,直接输出Map<String,Long>。

具体有什么区别,或者效率上有啥不同,待后续深入学习。

 

参考资料:

《Spark快速大数据分析》

 

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号