spark-sql缩减版样例:获取每日top3搜索词和各自的次数,包括总次数
- //获取出每天前3的搜索词
- ArrayList<String> log = new ArrayList<String>();
- log.add("2015-10-01,leo,a1,beijing,android");
- log.add("2015-10-01,leo,a1,beijing,android");
- log.add("2015-10-01,tom,a1,beijing,android");
- log.add("2015-10-01,jack,a1,beijing,android");
- log.add("2015-10-01,marry,a1,beijing,android");
- log.add("2015-10-01,tom,bbf,beijing,android");
- log.add("2015-10-01,jack,bbf,beijing,iphone");
- log.add("2015-10-01,jack,bbf,beijing,android");
- log.add("2015-10-01,leo,ttyu,beijing,android");
- log.add("2015-10-01,leo,ttyu,beijing,android");
- log.add("2015-10-01,wede,a1,beijing,android");
- log.add("2015-10-01,wede,bbf,beijing,iphone");
- log.add("2015-10-02,leo,a2,beijing,android");
- log.add("2015-10-02,tom,a2,beijing,android");
- log.add("2015-10-02,tom,a2,beijing,android");
- log.add("2015-10-02,jack,a1,beijing,android");
- log.add("2015-10-02,marry,a1,beijing,android");
- log.add("2015-10-02,leo,bbf,beijing,iphone");
- log.add("2015-10-02,jack,bbf,beijing,android");
- log.add("2015-10-02,wede,bbf,beijing,android");
- log.add("2015-10-02,leo,ttyu,beijing,android");
- log.add("2015-10-02,leo,ttyu,beijing,android");
- log.add("2015-10-02,jack,a1,beijing,android");
- log.add("2015-10-02,wede,tour,beijing,android");
- SparkConf conf = new SparkConf()
- // .setMaster("local")
- .setAppName("Top3UV");
- JavaSparkContext sc = new JavaSparkContext(conf);
- HiveContext sqlContext = new HiveContext(sc.sc());
- JavaRDD<String> rdd_list = sc.parallelize(log, 2);
- //0条件使用broadcast(每个worker节点共享一个变量)
- final org.apache.spark.broadcast.Broadcast<String> bc = sc.broadcast("iphone");
- //1条件过滤
- JavaRDD<String> rdd_filter_list = rdd_list.filter(new Function<String, Boolean>() {
- @Override
- public Boolean call(String v1) throws Exception {
- String ary[] = v1.split(",");
- String platform = ary[4];
- if (platform.contains(bc.value()))
- return false;
- return true;
- }
- });
- //2将每行数据构建成tuple2
- JavaPairRDD<String, String> rdd_tuple2_list = rdd_filter_list.mapToPair(new PairFunction<String, String, String>() {
- @Override
- public Tuple2<String, String> call(String s) throws Exception {
- String ary[] = s.split(",");
- String time = ary[0];
- String word = ary[2];
- String userName = ary[1];
- return new Tuple2<String, String>(time + "_" + word, userName);
- }
- });
- //3按照tuple._1进行combiner
- JavaPairRDD<String, Iterable<String>> rdd_byKey = rdd_tuple2_list.groupByKey();
- //4按照tuple._1进行用户数量去重后的统计
- JavaPairRDD<String, Integer> rdd_byKey_uv = rdd_byKey.mapToPair(new PairFunction<Tuple2<String, Iterable<String>>, String, Integer>() {//tuple._1仍然为时间_搜索词,而tuple._2变为用户去重后的数量
- @Override
- public Tuple2<String, Integer> call(Tuple2<String, Iterable<String>> stringIterableTuple2) throws Exception {
- String tuple_1 = stringIterableTuple2._1();
- Iterable<String> userNames = stringIterableTuple2._2();
- Set<String> userNameSet = new HashSet<String>();
- for (String item : userNames) {
- userNameSet.add(item);//用户名称
- }
- return new Tuple2<String, Integer>(tuple_1, userNameSet.size());
- }
- });
- //5构建rdd<Row>用来映射DataFrame
- JavaRDD<Row> rdd_byKey_row_uv = rdd_byKey_uv.map(new Function<Tuple2<String, Integer>, Row>() {
- @Override
- public Row call(Tuple2<String, Integer> stringIntegerTuple2) throws Exception {
- String ary[] = stringIntegerTuple2._1().split("_");
- return RowFactory.create(ary[0], ary[1], stringIntegerTuple2._2());
- }
- });
- List<StructField> list = new ArrayList<StructField>();
- list.add(DataTypes.createStructField("date", DataTypes.StringType, true));
- list.add(DataTypes.createStructField("word", DataTypes.StringType, true));
- list.add(DataTypes.createStructField("uv_num", DataTypes.IntegerType, true));
- StructType tmpType = DataTypes.createStructType(list);
- DataFrame df_tuple = sqlContext.createDataFrame(rdd_byKey_row_uv, tmpType);
- df_tuple.registerTempTable("tuple_keyDS_valUN");
- //6使用DataFrame结合开窗函数row_number分组后过滤出访问量前3的搜索词
- StringBuilder _sb = new StringBuilder();
- _sb.append("select date,word,uv_num from ( ");
- _sb.append(" select date,word,uv_num, row_number() OVER (PARTITION BY date ORDER BY uv_num DESC ) as rank from tuple_keyDS_valUN ");
- _sb.append(" ) tmp_group_top3 where rank<=3");
- DataFrame df_tuple_groupTop3 = sqlContext.sql(_sb.toString()).cache();
- //df_tuple_groupTop3.show();//***************在最下面打印
- //=====到这里已经获取到每天前3的“搜索词“和“uv数“,并倒叙排序
- //在获取每天排名前三“搜索词”的总uv数
- //7将结果从DataFrame转换回rdd,并拼接成tuple2(日期,总访问量_访问词)
- JavaPairRDD<String, String> rdd_uvKey = df_tuple_groupTop3.javaRDD().mapToPair(new PairFunction<Row, String, String>() {
- @Override
- public Tuple2<String, String> call(Row row) throws Exception {
- String date = row.getString(0);
- String word = row.getString(1);
- Integer uv_mun = row.getInt(2);
- return new Tuple2<String, String>(date, uv_mun + "_" + word);
- }
- });
- //8mapToPair后继续按照key合并
- JavaPairRDD<String, Iterable<String>> rdd_dateKey_group = rdd_uvKey.groupByKey();
- JavaPairRDD<Integer, String> rdd_uvKey_combiner = rdd_dateKey_group.mapToPair(new PairFunction<Tuple2<String, Iterable<String>>, Integer, String>() {
- @Override
- public Tuple2<Integer, String> call(Tuple2<String, Iterable<String>> stringIterableTuple2) throws Exception {
- Integer uv_sum = 0;
- String data_word = "";
- Iterable<String> uv_word = stringIterableTuple2._2();
- Iterator<String> uv_word_it = uv_word.iterator();
- for (; uv_word_it.hasNext(); ) {
- String uv_word_str = uv_word_it.next();
- String ary[] = uv_word_str.split("_");
- Integer uv = Integer.valueOf(ary[0]);
- uv_sum += uv;//累加总uv数
- String word = ary[1];
- data_word += stringIterableTuple2._1() + "_" + word + "|";
- }
- return new Tuple2<Integer, String>(uv_sum, data_word);
- }
- });
- JavaPairRDD<Integer, String> rdd_uvKey_sort = rdd_uvKey_combiner.sortByKey(false);
- List<Tuple2<Integer, String>> ret = rdd_uvKey_sort.collect();
- for (Tuple2<Integer, String> item : ret) {
- System.out.println(item._1() + "<--->" + item._2());
- }
- df_tuple_groupTop3.show();
spark-sql缩减版样例:获取每日top3搜索词和各自的次数,包括总次数的更多相关文章
- HttpClient4.3.3 使用样例—获取静态资源
HttpClient4.3.3 使用样例—获取静态资源 学习了:http://shihlei.iteye.com/blog/2067688
- spark单机部署及样例运行
spark单机运行部署 环境预装 需要预先下载jdk和spark.机器使用centos6.6(推荐).然后依次运行 [root@spark-master root]# cd /root #安装必要的软 ...
- python获取每日涨跌停股票统计,封闭时间和打开次数
接口:limit_list 描述:获取每日涨跌停股票统计,包括封闭时间和打开次数等数据,帮助用户快速定位近期强(弱)势股,以及研究超短线策略. 限量:单次最大1000,总量不限制 积分:用户积2000 ...
- SQL集合操作符样例(UNION,INTERSECT,EXCEPT)
由于MYSQL目前只实现了UNION, 所以后面两个就没得玩罗.... SELECT emp_id, assigned_branch_id -> FROM employee -> WHER ...
- php 获取淘宝搜索词 内容
$s = file_get_contents('http://suggest.taobao.com/sug?extras=1&code=utf-8&callback=g_ks_sugg ...
- SQL SEVER 2008中的演示样例数据库
SQL SEVER 2008数据库是什么我就不说了,我在这里分享一下怎样学习SQL SEVER 2008数据库,假设是对数据库或是SQL SEVER 数据库全然陌生或是不熟悉的人来说,建议看看一些视频 ...
- 48、Spark SQL之与Spark Core整合之每日top3热点搜索词统计案例实战
一.概述 1.需求分析 数据格式: 日期 用户 搜索词 城市 平台 版本 需求: 1.筛选出符合查询条件(城市.平台.版本)的数据 2.统计出每天搜索uv排名前3的搜索词 3.按照每天的top3搜索词 ...
- spark mllib lda 中文分词、主题聚合基本样例
github https://github.com/cclient/spark-lda-example spark mllib lda example 官方示例较为精简 在官方lda示例的基础上,给合 ...
- Spark SQL 之 Data Sources
#Spark SQL 之 Data Sources 转载请注明出处:http://www.cnblogs.com/BYRans/ 数据源(Data Source) Spark SQL的DataFram ...
随机推荐
- HTML5商城开发五 实现返回页面顶部
本文内容主要是网上参考收集,介绍四种简单的返回页面顶部代码,可以使用简单的HTML锚标记,也可使用Javascript Scroll函数动态返回等等. 一.使用锚标记返回页面顶部 使用HTML锚标记最 ...
- JS函数可以再添加属性(包括方法)
1 前言 JS函数可以再添加属性(包括方法),这个有点有趣,记录一下. 2 代码 <!DOCTYPE html> <html> <head> <title&g ...
- Solr简单使用
1.添加索引 // 第一步:把solrJ的jar包添加到工程中. // 第二步:创建一个SolrServer,使用HttpSolrServer创建对象. SolrServer solrServer = ...
- 关于eclipse从svn导入项目
第一次直接从eclipse svn资源库输入svn url直接将项目下载到workspace结果,web项目成了Java项目,这样操作是错误的 正确的操作应该是: file,import ,找到svn ...
- tp5的phpword使用
1.使用composer安装phpoffice/phpword phpword的使用文档:https://phpword.readthedocs.io/en/latest/index.html 2.使 ...
- day12.生成器;wraps初识
生成器 在 Python 中,使用了 yield 的函数被称为生成器(generator). 跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器. 在 ...
- python运算符——算数运算符
加减乘除比较简单这里不多赘述了,print(2 +-*/ 3),唯一需要注意的就是整除运算,符号是“//”,整除运算取的是整数部分,而不是四舍五入哦! print(5 / 2) 这个运行的结果是 ...
- open_basedir php授权目录设置
php为了安全性考虑,有一项 open_basedir 的设置.根据你web服务器环境,open_basedir可以在几个地方设置. 首先 在php.ini中配置. ;open_basedir = 如 ...
- 014 链表中倒数第k个结点
1.题目 输入一个链表,输出该链表中倒数第k个结点. 2.思路 Java代码,通过校验.代码思路如下:两个指针,先让第一个指针和第二个指针都指向头结点,然后再让第一个指正走(k-1)步,到达第k个节点 ...
- Imcash:坐下来认真和你们说说话
筹备已久的Imcash终于快上线了,上线后会用作品向你们证明你们的选择是正确的.在准备的半年期间里,团队从调研.设计.市场.人员.技术方面都尽量按照最高要求来配置.从一站式服务平台到现在的资产管家,每 ...