1. //获取出每天前3的搜索词
  2. ArrayList<String> log = new ArrayList<String>();
  3. log.add("2015-10-01,leo,a1,beijing,android");
  4. log.add("2015-10-01,leo,a1,beijing,android");
  5. log.add("2015-10-01,tom,a1,beijing,android");
  6. log.add("2015-10-01,jack,a1,beijing,android");
  7. log.add("2015-10-01,marry,a1,beijing,android");
  8. log.add("2015-10-01,tom,bbf,beijing,android");
  9. log.add("2015-10-01,jack,bbf,beijing,iphone");
  10. log.add("2015-10-01,jack,bbf,beijing,android");
  11. log.add("2015-10-01,leo,ttyu,beijing,android");
  12. log.add("2015-10-01,leo,ttyu,beijing,android");
  13. log.add("2015-10-01,wede,a1,beijing,android");
  14. log.add("2015-10-01,wede,bbf,beijing,iphone");
  15. log.add("2015-10-02,leo,a2,beijing,android");
  16. log.add("2015-10-02,tom,a2,beijing,android");
  17. log.add("2015-10-02,tom,a2,beijing,android");
  18. log.add("2015-10-02,jack,a1,beijing,android");
  19. log.add("2015-10-02,marry,a1,beijing,android");
  20. log.add("2015-10-02,leo,bbf,beijing,iphone");
  21. log.add("2015-10-02,jack,bbf,beijing,android");
  22. log.add("2015-10-02,wede,bbf,beijing,android");
  23. log.add("2015-10-02,leo,ttyu,beijing,android");
  24. log.add("2015-10-02,leo,ttyu,beijing,android");
  25. log.add("2015-10-02,jack,a1,beijing,android");
  26. log.add("2015-10-02,wede,tour,beijing,android");
  27.  
  28. SparkConf conf = new SparkConf()
  29. // .setMaster("local")
  30. .setAppName("Top3UV");
  31. JavaSparkContext sc = new JavaSparkContext(conf);
  32. HiveContext sqlContext = new HiveContext(sc.sc());
  33.  
  34. JavaRDD<String> rdd_list = sc.parallelize(log, 2);
  35. //0条件使用broadcast(每个worker节点共享一个变量)
  36. final org.apache.spark.broadcast.Broadcast<String> bc = sc.broadcast("iphone");
  37.  
  38. //1条件过滤
  39. JavaRDD<String> rdd_filter_list = rdd_list.filter(new Function<String, Boolean>() {
  40. @Override
  41. public Boolean call(String v1) throws Exception {
  42. String ary[] = v1.split(",");
  43. String platform = ary[4];
  44. if (platform.contains(bc.value()))
  45. return false;
  46. return true;
  47. }
  48. });
  49. //2将每行数据构建成tuple2
  50. JavaPairRDD<String, String> rdd_tuple2_list = rdd_filter_list.mapToPair(new PairFunction<String, String, String>() {
  51. @Override
  52. public Tuple2<String, String> call(String s) throws Exception {
  53. String ary[] = s.split(",");
  54. String time = ary[0];
  55. String word = ary[2];
  56. String userName = ary[1];
  57. return new Tuple2<String, String>(time + "_" + word, userName);
  58. }
  59. });
  60. //3按照tuple._1进行combiner
  61. JavaPairRDD<String, Iterable<String>> rdd_byKey = rdd_tuple2_list.groupByKey();
  62.  
  63. //4按照tuple._1进行用户数量去重后的统计
  64. JavaPairRDD<String, Integer> rdd_byKey_uv = rdd_byKey.mapToPair(new PairFunction<Tuple2<String, Iterable<String>>, String, Integer>() {//tuple._1仍然为时间_搜索词,而tuple._2变为用户去重后的数量
  65. @Override
  66. public Tuple2<String, Integer> call(Tuple2<String, Iterable<String>> stringIterableTuple2) throws Exception {
  67. String tuple_1 = stringIterableTuple2._1();
  68. Iterable<String> userNames = stringIterableTuple2._2();
  69. Set<String> userNameSet = new HashSet<String>();
  70. for (String item : userNames) {
  71. userNameSet.add(item);//用户名称
  72. }
  73. return new Tuple2<String, Integer>(tuple_1, userNameSet.size());
  74. }
  75. });
  76.  
  77. //5构建rdd<Row>用来映射DataFrame
  78. JavaRDD<Row> rdd_byKey_row_uv = rdd_byKey_uv.map(new Function<Tuple2<String, Integer>, Row>() {
  79. @Override
  80. public Row call(Tuple2<String, Integer> stringIntegerTuple2) throws Exception {
  81. String ary[] = stringIntegerTuple2._1().split("_");
  82. return RowFactory.create(ary[0], ary[1], stringIntegerTuple2._2());
  83. }
  84. });
  85.  
  86. List<StructField> list = new ArrayList<StructField>();
  87. list.add(DataTypes.createStructField("date", DataTypes.StringType, true));
  88. list.add(DataTypes.createStructField("word", DataTypes.StringType, true));
  89. list.add(DataTypes.createStructField("uv_num", DataTypes.IntegerType, true));
  90. StructType tmpType = DataTypes.createStructType(list);
  91. DataFrame df_tuple = sqlContext.createDataFrame(rdd_byKey_row_uv, tmpType);
  92. df_tuple.registerTempTable("tuple_keyDS_valUN");
  93.  
  94. //6使用DataFrame结合开窗函数row_number分组后过滤出访问量前3的搜索词
  95. StringBuilder _sb = new StringBuilder();
  96. _sb.append("select date,word,uv_num from ( ");
  97. _sb.append(" select date,word,uv_num, row_number() OVER (PARTITION BY date ORDER BY uv_num DESC ) as rank from tuple_keyDS_valUN ");
  98. _sb.append(" ) tmp_group_top3 where rank<=3");
  99.  
  100. DataFrame df_tuple_groupTop3 = sqlContext.sql(_sb.toString()).cache();
  101. //df_tuple_groupTop3.show();//***************在最下面打印
  102.  
  103. //=====到这里已经获取到每天前3的“搜索词“和“uv数“,并倒叙排序
  104.  
  105. //在获取每天排名前三“搜索词”的总uv数
  106.  
  107. //7将结果从DataFrame转换回rdd,并拼接成tuple2(日期,总访问量_访问词)
  108. JavaPairRDD<String, String> rdd_uvKey = df_tuple_groupTop3.javaRDD().mapToPair(new PairFunction<Row, String, String>() {
  109. @Override
  110. public Tuple2<String, String> call(Row row) throws Exception {
  111. String date = row.getString(0);
  112. String word = row.getString(1);
  113. Integer uv_mun = row.getInt(2);
  114. return new Tuple2<String, String>(date, uv_mun + "_" + word);
  115. }
  116. });
  117.  
  118. //8mapToPair后继续按照key合并
  119. JavaPairRDD<String, Iterable<String>> rdd_dateKey_group = rdd_uvKey.groupByKey();
  120.  
  121. JavaPairRDD<Integer, String> rdd_uvKey_combiner = rdd_dateKey_group.mapToPair(new PairFunction<Tuple2<String, Iterable<String>>, Integer, String>() {
  122. @Override
  123. public Tuple2<Integer, String> call(Tuple2<String, Iterable<String>> stringIterableTuple2) throws Exception {
  124. Integer uv_sum = 0;
  125. String data_word = "";
  126. Iterable<String> uv_word = stringIterableTuple2._2();
  127. Iterator<String> uv_word_it = uv_word.iterator();
  128. for (; uv_word_it.hasNext(); ) {
  129. String uv_word_str = uv_word_it.next();
  130. String ary[] = uv_word_str.split("_");
  131. Integer uv = Integer.valueOf(ary[0]);
  132. uv_sum += uv;//累加总uv数
  133. String word = ary[1];
  134. data_word += stringIterableTuple2._1() + "_" + word + "|";
  135. }
  136.  
  137. return new Tuple2<Integer, String>(uv_sum, data_word);
  138. }
  139. });
  140.  
  141. JavaPairRDD<Integer, String> rdd_uvKey_sort = rdd_uvKey_combiner.sortByKey(false);
  142.  
  143. List<Tuple2<Integer, String>> ret = rdd_uvKey_sort.collect();
  144. for (Tuple2<Integer, String> item : ret) {
  145. System.out.println(item._1() + "<--->" + item._2());
  146. }
  147. df_tuple_groupTop3.show();

spark-sql缩减版样例:获取每日top3搜索词和各自的次数,包括总次数的更多相关文章

  1. HttpClient4.3.3 使用样例—获取静态资源

    HttpClient4.3.3 使用样例—获取静态资源 学习了:http://shihlei.iteye.com/blog/2067688

  2. spark单机部署及样例运行

    spark单机运行部署 环境预装 需要预先下载jdk和spark.机器使用centos6.6(推荐).然后依次运行 [root@spark-master root]# cd /root #安装必要的软 ...

  3. python获取每日涨跌停股票统计,封闭时间和打开次数

    接口:limit_list 描述:获取每日涨跌停股票统计,包括封闭时间和打开次数等数据,帮助用户快速定位近期强(弱)势股,以及研究超短线策略. 限量:单次最大1000,总量不限制 积分:用户积2000 ...

  4. SQL集合操作符样例(UNION,INTERSECT,EXCEPT)

    由于MYSQL目前只实现了UNION, 所以后面两个就没得玩罗.... SELECT emp_id, assigned_branch_id -> FROM employee -> WHER ...

  5. php 获取淘宝搜索词 内容

    $s = file_get_contents('http://suggest.taobao.com/sug?extras=1&code=utf-8&callback=g_ks_sugg ...

  6. SQL SEVER 2008中的演示样例数据库

    SQL SEVER 2008数据库是什么我就不说了,我在这里分享一下怎样学习SQL SEVER 2008数据库,假设是对数据库或是SQL SEVER 数据库全然陌生或是不熟悉的人来说,建议看看一些视频 ...

  7. 48、Spark SQL之与Spark Core整合之每日top3热点搜索词统计案例实战

    一.概述 1.需求分析 数据格式: 日期 用户 搜索词 城市 平台 版本 需求: 1.筛选出符合查询条件(城市.平台.版本)的数据 2.统计出每天搜索uv排名前3的搜索词 3.按照每天的top3搜索词 ...

  8. spark mllib lda 中文分词、主题聚合基本样例

    github https://github.com/cclient/spark-lda-example spark mllib lda example 官方示例较为精简 在官方lda示例的基础上,给合 ...

  9. Spark SQL 之 Data Sources

    #Spark SQL 之 Data Sources 转载请注明出处:http://www.cnblogs.com/BYRans/ 数据源(Data Source) Spark SQL的DataFram ...

随机推荐

  1. HTML5商城开发五 实现返回页面顶部

    本文内容主要是网上参考收集,介绍四种简单的返回页面顶部代码,可以使用简单的HTML锚标记,也可使用Javascript Scroll函数动态返回等等. 一.使用锚标记返回页面顶部 使用HTML锚标记最 ...

  2. JS函数可以再添加属性(包括方法)

    1 前言 JS函数可以再添加属性(包括方法),这个有点有趣,记录一下. 2 代码 <!DOCTYPE html> <html> <head> <title&g ...

  3. Solr简单使用

    1.添加索引 // 第一步:把solrJ的jar包添加到工程中. // 第二步:创建一个SolrServer,使用HttpSolrServer创建对象. SolrServer solrServer = ...

  4. 关于eclipse从svn导入项目

    第一次直接从eclipse svn资源库输入svn url直接将项目下载到workspace结果,web项目成了Java项目,这样操作是错误的 正确的操作应该是: file,import ,找到svn ...

  5. tp5的phpword使用

    1.使用composer安装phpoffice/phpword phpword的使用文档:https://phpword.readthedocs.io/en/latest/index.html 2.使 ...

  6. day12.生成器;wraps初识

    生成器 在 Python 中,使用了 yield 的函数被称为生成器(generator). 跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器. 在 ...

  7. python运算符——算数运算符

    加减乘除比较简单这里不多赘述了,print(2 +-*/ 3),唯一需要注意的就是整除运算,符号是“//”,整除运算取的是整数部分,而不是四舍五入哦! print(5 / 2)    这个运行的结果是 ...

  8. open_basedir php授权目录设置

    php为了安全性考虑,有一项 open_basedir 的设置.根据你web服务器环境,open_basedir可以在几个地方设置. 首先 在php.ini中配置. ;open_basedir = 如 ...

  9. 014 链表中倒数第k个结点

    1.题目 输入一个链表,输出该链表中倒数第k个结点. 2.思路 Java代码,通过校验.代码思路如下:两个指针,先让第一个指针和第二个指针都指向头结点,然后再让第一个指正走(k-1)步,到达第k个节点 ...

  10. Imcash:坐下来认真和你们说说话

    筹备已久的Imcash终于快上线了,上线后会用作品向你们证明你们的选择是正确的.在准备的半年期间里,团队从调研.设计.市场.人员.技术方面都尽量按照最高要求来配置.从一站式服务平台到现在的资产管家,每 ...