1 项目流程介绍:
1.1 读取Hbase中的数据表,提取需要的字段,进行处理(统计每首歌有多少点击量),再次建表,将处理后的数据填充进去
1.2 2 此时的数据不是排序的,将数据排序后上传到HDFS中去
2 结果演示:
1 原始数据

2 第一次处理。提取处理需要统计的结果数据,存放在第三方数据表中:namelist中

3 上传到HDFS中去,是排序后的最终结果
在这里插入代码片
3 代码部分:

整个思路:分成了两个部分(job)
job1:读取Hbase中的原始数据表(music4),提取info列组:name(歌名)
map输出歌名 value 1。存储到namelist中去
job2 :将namelist排序,存储到HDFS中去:
代码如下:

package com.sheng.hbase;import java.io.IOException;
import java.io.InputStream;
import java.util.List;import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellUtil;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;
import org.apache.hadoop.hbase.mapreduce.TableMapper;
import org.apache.hadoop.hbase.mapreduce.TableReducer;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.io.IOUtils;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.WritableComparable;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;public class TopMusic {//Hbase中的表static final String TABLE_MUSIC = "music4";//第三方表static final String TABLE_NAMELIST = "namelist";//将最终结果传入HDFS中static final String OUTPUT_PATH = "topmusic";/*** 扫描每一行数据中的列info:name.并且从Hbase的原始表处理完后,加入到Hbase中的第三方表*///只需要输出歌名和歌的点击次数,所以参数如下设置static class ScanMusicMapper extends TableMapper<Text, IntWritable> {@Overrideprotected void map(ImmutableBytesWritable key, Result value, Context context)throws IOException, InterruptedException {//集合存储单元格数据List<Cell> cells = value.listCells();//循环每一个单元格数据for (Cell cell : cells) {//只扫描info列组下的name字段,也就是歌名if (Bytes.toString(CellUtil.cloneFamily(cell)).equals("info")&& Bytes.toString(CellUtil.cloneQualifier(cell)).equals("name")) {//将歌名作为value值输出context.write(new Text(Bytes.toString(CellUtil.cloneValue(cell))), // 单元格的唯一标识new IntWritable(1));/** song1 1* song2    2* song3    3* */}}}}/*** 汇总每首歌曲播放总次数*/static class IntNumReducer extends TableReducer<Text, IntWritable, Text> {@Overrideprotected void reduce(Text key, Iterable<IntWritable> values, Context context)throws IOException, InterruptedException {//记录点击次数int playCount = 0;//将点击次数进行叠加for (IntWritable num : values) {playCount += num.get();}// 为Put操作指定行键Put put = new Put(Bytes.toBytes(key.toString()));/* 为Put操作指定列和值*自己制定第三方表中的的列组和列名,因为只需要歌名和统计次数,所以如下*addColumn:参数设置:1 列组名    2 列名    3 value值*/put.addColumn(Bytes.toBytes("details"), Bytes.toBytes("rank"), Bytes.toBytes(playCount));//换句话话讲:就是将行键和value值进行插入到第三表:namelistcontext.write(key, put);}}/*** 扫描全部歌曲名称并获得每首歌曲被播放次数.输出键/值:播放次数/歌名,输出目的地:HDSF文件* 将表从Hbase中输出到HDFS中,只需要写mapper即可* * 由参数可知,输出的内容形式为:* 1 song1* 2 song2* 3 song3*/static class ScanMusicNameMapper extends TableMapper<IntWritable, Text> {@Overrideprotected void map(ImmutableBytesWritable key, Result value, Context context)throws IOException, InterruptedException {//存储单元格信息List<Cell> cells = value.listCells();for (Cell cell : cells) {//输出:value值    歌名context.write(new IntWritable(Bytes.toInt(CellUtil.cloneValue(cell))),new Text(Bytes.toString(key.get())));}}}/*** 实现降序*/private static class IntWritableDecreaseingComparator extends IntWritable.Comparator {@Overridepublic int compare(WritableComparable a, WritableComparable b) {return -super.compare(a, b);// 比较结果取负数即可降序}@Overridepublic int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2) {return -super.compare(b1, s1, l1, b2, s2, l2);}}/*** 配置作业:播放统计*/static boolean musicCount() throws IOException, ClassNotFoundException, InterruptedException {//创建提交任务Job job = Job.getInstance(conf, "music-count");// MapReduce程序作业基本配置// job.setJarByClass(TopMusic.class);job.setJar("E:\\jar\\HbaseMaven.jar");//Reduce任务数job.setNumReduceTasks(2);//创建scan并扫描需要统计的字段 Scan scan = new Scan();scan.addColumn(Bytes.toBytes("info"), Bytes.toBytes("name"));// 解决三方jar文件依赖:3)使用TableMapReduceUtil// TableMapReduceUtil.addDependencyJars(job);// 推荐使用 加入分布缓存中// 如果TABLE_NAMELIST存在则不做任何操作,如果HBASE表不存在则新建表//创建配置文件的连接Connection conn = ConnectionFactory.createConnection(conf);Admin hAdmin = conn.getAdmin();//第三方表:namelistTableName outTN = TableName.valueOf(TABLE_NAMELIST);//如果没有该表就创建if (!hAdmin.isTableAvailable(outTN)) {System.out.println("Table Not Exists! Create Table");HTableDescriptor hTableDescriptor = new HTableDescriptor(outTN);hTableDescriptor.addFamily(new HColumnDescriptor("details".getBytes()));hAdmin.createTable(hTableDescriptor);} else {System.out.println("Table  Exists!  not Create Table");}// 使用hbase提供的工具类来设置job/** mapper类  需要输出类型* reduce类* */TableMapReduceUtil.initTableMapperJob(TABLE_MUSIC, scan, ScanMusicMapper.class, Text.class, IntWritable.class,job);TableMapReduceUtil.initTableReducerJob(TABLE_NAMELIST, IntNumReducer.class, job);System.out.println(" job1...处理!Hbase-->Hbase");return job.waitForCompletion(true);}////*** 配置作业:排序*/static boolean sortMusic() throws IOException, ClassNotFoundException, InterruptedException {Job job = Job.getInstance(conf, "sort-music");// job.setJarByClass(TopMusic.class);job.setJar("E:\\jar\\HbaseMaven.jar");job.setNumReduceTasks(1);job.setSortComparatorClass(IntWritableDecreaseingComparator.class);TableMapReduceUtil.initTableMapperJob(TABLE_NAMELIST, new Scan(), ScanMusicNameMapper.class, IntWritable.class,Text.class, job);Path output = new Path(OUTPUT_PATH);if (FileSystem.get(conf).exists(output))FileSystem.get(conf).delete(output, true);FileOutputFormat.setOutputPath(job, output);System.out.println(" job2...处理");return job.waitForCompletion(true);}/*** 查看输出文件*/static void showResult() throws IllegalArgumentException, IOException {FileSystem fs = FileSystem.get(conf);InputStream in = null;try {in = fs.open(new Path(OUTPUT_PATH + "/part-r-00000"));IOUtils.copyBytes(in, System.out, 4096, false);} finally {IOUtils.closeStream(in);}}static Configuration conf = HBaseConfiguration.create();public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {conf.set("mapreduce.app-submission.cross-platform", "true");// 允许跨平台if (musicCount()) {if (sortMusic()) {showResult();}}}
}

大数据统计歌曲的排行榜 ,输出到指定的HBASE数据库中相关推荐

  1. web端业务数据管理平台+Axure运营数据管理平台+月度数据统计分析+年度排行榜数据统计页面分析+运营大数据统计管理后台+用户信息管理+Axure通用web端高保真交互业务数据管理平台

    作品介绍:原型内容包含:web端业务数据管理平台+Axure运营数据管理平台+月度数据统计分析+年度排行榜数据统计页面分析+运营大数据统计管理后台+用户信息管理+Axure通用web端高保真交互业务数 ...

  2. Axure高保真移动端智能数据监控+用户画像+饼状图+条形图+折线图数据统计+抖音直播app用户数据统计+智慧移动端主播粉丝、评论、播放量大数据统计+套餐购买、续费套餐prd流程

    作品介绍:Axure高保真移动端智能数据监控+用户画像+饼状图+条形图+折线图数据统计+直播app用户数据统计+智慧移动端主播粉丝.评论.播放量大数据统计+套餐购买.续费套餐prd流程 原型演示及下载 ...

  3. 图解大数据 | 应用Map-Reduce进行大数据统计@实操案例

    作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/84 本文地址:http://www.showmeai.tech/article-det ...

  4. 据大数据统计,就业薪资最高和最低的20个专业【乐搏TestPRO】

    一.大数据分析薪酬排行 大数据统计薪酬网公布2019年中国内地大学毕业生薪酬排行榜TOP200, 其中,清华大学2017届毕业生平均薪酬最高,达到9065元. 北京大学和北京外国语大学分别位居第二和第 ...

  5. 京东手机电商大数据统计平台搭建

    京东手机电商大数据统计平台搭建 一.虚拟机搭建 1.下载虚拟机 2.解压虚拟机 3.VMware扫描添加虚拟机 4.虚拟机网络说明 5.虚拟机已安装软件和框架说明 二.核心代码 三.数据展示环境搭建 ...

  6. 大数据统计大量股票开盘平均价和收盘平均价

    大数据统计大量股票开盘和收盘的平均价 一.需要统计的文件: 二.单个文件内容: 三.程序: 程序来自小奶狗的博客 连接为:https://blog.csdn.net/pengyangyan/artic ...

  7. 大数据统计租房市场现状(上海篇)

    对某方面有统计需求的同学可以留言哟~O(∩_∩)O~!!! 数据下载时间:20170620 房间均价:为了对比1房,2房,3房哪个比较划算引入的概念.一条出租信息中,平均每个房间的价格,例如:3房的房 ...

  8. 大数据统计租房市场现状(深圳篇)

    对某方面有统计需求的同学可以留言哟~O(∩_∩)O~!!! 数据下载时间:20170611 平均房间价格:为了对比1房,2房,3房哪个比较划算引入的概念.一条出租信息中,平均每个房间的价格,例如:3房 ...

  9. 大数据统计租房市场现状(北京篇)

    对某方面有统计需求的同学可以留言哟~O(∩_∩)O~!!! 数据下载时间:20170615 平均房间价格:为了对比1房,2房,3房哪个比较划算引入的概念.一条出租信息中,平均每个房间的价格,例如:3房 ...

最新文章

  1. 从科幻灵感开始的一场数据存储基础设施实验之旅
  2. pandas官方文档_电影数据轻松学习 Pandas
  3. mina 之IoService(翻译)
  4. OpenCV纹理对象的实时姿态估计
  5. 使用 Java 配置进行 Spring bean 管理
  6. python-函数的使用 0222
  7. C# 判断两个日期是否是同一天
  8. 剑指offer面试题:输入某二叉树的前序遍历和中序遍历,输出后序遍历
  9. 网路收报流程-网桥的处理流程(br网桥)(四)
  10. 思维导图使用技巧:手把手教你怎么画思维导图
  11. USACO 2021 December Contest, Bronze
  12. VScode打不开浏览器方法总结
  13. 校园网认证系统-802.1x协议介绍
  14. Linux环境下安装Calibre 源代码编译
  15. Python 改写__str__
  16. 仿今日头条后台管理系统(一)
  17. 计算机考研就业率,这8个考研专业,就业率一直居高不下,报了就是赚了!
  18. m031开发 新唐_基于新唐M031开发的激光测距仪方案
  19. notion 科研_科研新手全面入坑指南
  20. CountDownTimer 倒计时封装(可 暂停 继续 重新开始)

热门文章

  1. 关于加密解密有哪些你需要知道知识?一篇文章告诉你
  2. 游戏一、脑洞大开3(密文破译)
  3. redirect、redirect-action、chain三者的区别!
  4. mysql数据库事务四大特性的实现原理
  5. Java中Scanner 的用法/ Scanner怎么使用
  6. MySQL时间函数总结
  7. Substrate是什么,为什么要选择Substrate
  8. java架构师和大数据架构师有哪些不同
  9. Anconda 安装
  10. 协议和协议栈的区别?