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 ...
随机推荐
- Redis学习之二 数据类型和相关命令
原文:https://www.cnblogs.com/lonelyxmas/p/9073928.html 如果还不懂安装的,请看 Windows环境下安装Redis Redis一共支持五种数据类型 1 ...
- python结合pyvmomi批量关闭vmware虚拟机
#!/usr/bin/env python #参考https://github.com/vmware/pyvmomi/blob/master/sample/poweronvm.py "&qu ...
- Spring MVC详解
Spring MVC 教程,快速入门,深入分析 资源下载: Spring_MVC_教程_快速入门_深入分析V1.1.pdf SpringMVC核心配置文件示例.rar 目录 一.前言二.spring ...
- 轮播swiper配置选项
本文主要介绍了swiper配置选项,包含了轮播的无限滚动.懒加载.监听当前位置.上下翻页.过渡动画渐变.延时加载图片.自动轮播等: swiper官方链接DEMO <!DOCTYPE html&g ...
- Windows Internals 笔记——进程
1.一般将进程定义成一个正在运行的程序的一个实例,由以下两部分构成: 一个内核对象,操作系统用它来管理进程,内核对象也是系统保存进程统计信息的地方. 一个地址空间,其中包含所有可执行文件或DLL模块的 ...
- 阿里云centos7成功安装和启动nginx,但是外网访问不了的解决方案
问题环境: 阿里云centos7.4.1708 问题描述:成功配置,启动成功,外网访问不了 解决方案: 经过查阅文档,去阿里云后台查看,原来是新购的服务器都加入和实例安全组. (OMG)立即去配置.加 ...
- POJ 2391 Ombrophobic Bovines (二分答案+floyd+最大流)
<题目链接> 题目大意: 给定一个有$n$个顶点和$m$条边的无向图,点$i$ 处有$A_i$头牛,点$i$ 处的牛棚能容纳$B_i$头牛,每条边有一个时间花费$t_i$(表示从一个端点走 ...
- Unix历史及相关概念回顾
欢迎来到Unix的世界 很多人都用了很多年的Unix(其实更熟悉的是叫Linux),也接触到Unix世界中的各种概念,比如GCC.GNU.BSD.POSIX.GPL等等,也大都知道一些传奇的如雷贯耳的 ...
- php数组实现根据某个键值将相同键值合并生成新二维数组的方法
$infos = array( array( 'a' => 36, 'b' => 'xa', 'c' => '2015-08-28 00:00:00', 'd' => '201 ...
- 解决 gem 添加sources的时候提示 too many connection resets的问题
今天在安装ruby.gem的时候,发现在添加淘宝源的时候提示出错信息:"too many connection resets-",后来发现淘宝镜像已经没有了,改成ruby chin ...