共享单车之数据分析-统计共享单车每天的平均使用时间

这篇具有很好参考价值的文章主要介绍了共享单车之数据分析-统计共享单车每天的平均使用时间。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

第1关:统计共享单车每天的平均使用时间

  • 任务描述
  • 相关知识
    • 如何配置Hbase的MapReduce类
    • 如何使用Hbase的MapReduce进行数据分析
  • 编程要求
  • 测试说明

任务描述

本关任务:使用HbaseMapReduce对已经存在 Hbase 的共享单车运行数据进行分析,统计共享单车每天的平均使用时间,其中共享单车运行数据在Hbaset_shared_bicycle表中(表结构可在编程要求中进行查看)。

相关知识

为了完成本关任务,你需要掌握:

  1. 如何配置HbaseMapReduce类;
  2. 如何使用HbaseMapReduce进行数据分析。

如何配置HbaseMapReduce

MapReduce是运行在Job上的一个并行计算框架,分为Map节点和Reduce节点。

Hbase提供了org.apache.hadoop.hbase.mapreduce.TableMapReduceUtilinitTableMapperJobinitTableReducerJob两个方法来完成MapReduce的配置。

initTableMapperJob 方法:

 
  1. /**
  2.     *在提交TableMap作业之前使用它。 它会适当地设置
  3.     * 工作。
  4.    *
  5.     * @param table要读取的表名。
  6.     * @param scan具有列,时间范围等的扫描实例。
  7.     * @param mapper要使用的mapper类。
  8.     * @param outputKeyClass输出键的类。
  9.     * @param outputValueClass输出值的类。
  10.     * @param job当前要调整的工作。 确保传递的作业是
  11.     *携带所有必要的HBase配置。
  12.     * @throws IOException设置细节失败。
  13.    */
  14. public static void initTableMapperJob(String table, Scan scan,
  15. Class<? extends TableMapper> mapper,
  16. Class<?> outputKeyClass,
  17. Class<?> outputValueClass, Job job)
  18. throws IOException
  19. / **

initTableReducerJob 方法:

 
  1. /**
  2.     *在提交TableReduce作业之前使用它。 它会
  3.     *适当设置JobConf。
  4.    *
  5.     * @param table输出表。
  6.     * @param reducer要使用的reducer类。
  7.     * @param job当前要调整的工作。
  8.     * @throws IOException确定区域计数失败时。
  9.    */
  10. public static void initTableReducerJob(String table,
  11. Class<? extends TableReducer> reducer, Job job)
  12. throws IOException

如何使用HbaseMapReduce进行数据分析

下面我们以统计每个城市的酒店个数的例子来介绍MapReduceMap节点和Reduce节点:

Map节点执行类需要继承抽象类TableMapper,实现其map方法,结构如下:

 
  1. public static class MyMapper extends TableMapper<Text, DoubleWritable> {
  2. @Override
  3. protected void map(ImmutableBytesWritable rowKey, Result result, Context context) {
  4. }
  5. }

在**map方法中可从输入表(原数据表)得到行数据,最后向Reduce节点输出键值对(key/value)**。

 
  1. String cityId = Bytes.toString(result.getValue("cityInfo".getBytes(), "cityId".getBytes()));
  2. DoubleWritable i = new DoubleWritable(1);
  3. context.write(new Text(cityId),i);

下面介绍Reduce节点,Reduce节点执行类需要继承抽象类TableReducer,实现其reduce方法:

 
  1. public static class MyTableReducer extends TableReducer<Text, DoubleWritable, ImmutableBytesWritable> {
  2. @Override
  3. public void reduce(Text key, Iterable<DoubleWritable> values, Context context) {
  4. }
  5. }

reduce方法里会接收map方法里相同key的集合,最后把结果存到输出到表里

 
  1. double sum = 0;
  2. for (DoubleWritable num:values){
  3. sum += num.get();
  4. }
  5. Put put = new Put(Bytes.toBytes(key.toString()));
  6. put.addColumn("total_infos".getBytes(),"total".getBytes(),Bytes.toBytes(String.valueOf(sum)));
  7. context.write(null,put);//initTableReducerJob 设置了表名所以在这里无需设置了

编程要求

在右侧代码窗口完成代码编写:

  1. MapReduce类已经配置好,只需完成MapReduce的数据分析;

  2. map方法中,获取输入表t_shared_bicycle的相关信息,计算出使用时间=结束时间 - 开始时间,并把使用时间开始时间的日期传给reduce

  3. reduce方法中通过使用时间开始时间的日期计算共享单车每天平均使用时间,并把每天平均使用时间,四舍五入保留两位有效数字,存入到列族为info,字段为avgTime,ROWKEY 为avgTime的表里。

t_shared_bicycle表结构如下:

列族名称 字段 对应的文件的描述 ROWKEY (格式为:骑行id
info beginTime 开始时间 trip_id
info endTime 结束时间 trip_id
info bicycleId 车辆id trip_id
info departure 出发地 trip_id
info destination 目的地 trip_id
info city 所在城市 trip_id
info start_longitude 开始经度 trip_id
info stop_longitude 结束经度 trip_id
info start_latitude 开始纬度 trip_id
info stop_latitude 结束纬度 trip_id

测试说明

平台会对你编写的代码进行测试,若是与预期输出相同,则算通关。


开始你的任务吧,祝你成功!文章来源地址https://www.toymoban.com/news/detail-779875.html

package com.educoder.bigData.sharedbicycle;

import java.io.IOException;
import java.text.ParseException;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.Scanner;
import java.math.RoundingMode;
import java.math.BigDecimal;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.apache.commons.lang3.time.FastDateFormat;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
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.BytesWritable;
import org.apache.hadoop.io.DoubleWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.util.Tool;

import com.educoder.bigData.util.HBaseUtil;

/**
 * 统计共享单车每天的平均使用时间
 */
public class AveragetTimeMapReduce extends Configured implements Tool {

	public static final byte[] family = "info".getBytes();

	public static class MyMapper extends TableMapper<Text, BytesWritable> {
		protected void map(ImmutableBytesWritable rowKey, Result result, Context context)
				throws IOException, InterruptedException {
			/********** Begin *********/
		 long beginTime = Long.parseLong(Bytes.toString(result.getValue(family, "beginTime".getBytes())));
		 long endTime = Long.parseLong(Bytes.toString(result.getValue(family, "endTime".getBytes())));
		 String format = DateFormatUtils.format(beginTime, "yyyy-MM-dd", Locale.CHINA);
		 long useTime = endTime - beginTime;
		 BytesWritable bytesWritable = new BytesWritable(Bytes.toBytes(format + "_" + useTime));
		 context.write(new Text("avgTime"), bytesWritable);	 
			/********** End *********/
		}
	}

	public static class MyTableReducer extends TableReducer<Text, BytesWritable, ImmutableBytesWritable> {
		@Override
		public void reduce(Text key, Iterable<BytesWritable> values, Context context)
				throws IOException, InterruptedException {
			/********** Begin *********/
		  double sum = 0;
			int length = 0;
			Map<String, Long> map = new HashMap<String, Long>();
			for (BytesWritable price : values) {
				byte[] copyBytes = price.copyBytes();
				String string = Bytes.toString(copyBytes);
				String[] split = string.split("_");
				if (map.containsKey(split[0])) {
					Long integer = map.get(split[0]) + Long.parseLong(split[1]);
					map.put(split[0], integer);
				} else {
					map.put(split[0], Long.parseLong(split[1]));
				}
			}
			Collection<Long> values2 = map.values();
			for (Long i : values2) {
				length++;
				sum += i;
			}
			BigDecimal decimal = new BigDecimal(sum / length /1000);
			BigDecimal setScale = decimal.setScale(2, RoundingMode.HALF_DOWN);
			Put put = new Put(Bytes.toBytes(key.toString()));
			put.addColumn(family, "avgTime".getBytes(), Bytes.toBytes(setScale.toString()));
			context.write(null, put);
			/********** End *********/
		}

	}

	public int run(String[] args) throws Exception {
		// 配置Job
		Configuration conf = HBaseUtil.conf;
		// Scanner sc = new Scanner(System.in);
		// String arg1 = sc.next();
		// String arg2 = sc.next();
		String arg1 = "t_shared_bicycle";
		String arg2 = "t_bicycle_avgtime";
		try {
			HBaseUtil.createTable(arg2, new String[] { "info" });
		} catch (Exception e) {
			// 创建表失败
			e.printStackTrace();
		}
		Job job = configureJob(conf, new String[] { arg1, arg2 });
		return job.waitForCompletion(true) ? 0 : 1;
	}

	private Job configureJob(Configuration conf, String[] args) throws IOException {
		String tablename = args[0];
		String targetTable = args[1];
		Job job = new Job(conf, tablename);
		Scan scan = new Scan();
		scan.setCaching(300);
		scan.setCacheBlocks(false);// 在mapreduce程序中千万不要设置允许缓存
		// 初始化Mapreduce程序
		TableMapReduceUtil.initTableMapperJob(tablename, scan, MyMapper.class, Text.class, BytesWritable.class, job);
		// 初始化Reduce
		TableMapReduceUtil.initTableReducerJob(targetTable, // output table
				MyTableReducer.class, // reducer class
				job);
		job.setNumReduceTasks(1);
		return job;
	}
}

到了这里,关于共享单车之数据分析-统计共享单车每天的平均使用时间的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 大数据毕业设计 共享单车数据分析与可视化系统 - Python

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年02月06日
    浏览(41)
  • 大数据毕设项目 - 基于大数据的共享单车数据分析与可视化

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年03月13日
    浏览(40)
  • 【计算机毕设选题】基于大数据的共享单车数据分析与可视化

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年02月21日
    浏览(41)
  • 【Python 数据分析】描述性统计:平均数(均值)、方差、标准差、极大值、极小值、中位数、百分位数、用箱型图表示分位数

    前面讲了数据分析中的第一步:数据预处理,下面就是数据分析的其中一个重头戏:描述性统计,具体内容为: 平均数(均值)、方差、标准差、极大值、极小值、中位数、百分位数、用箱型图表示分位数 。 关键方法 含义 .mean() 求均值 .var() 求方差 .std() 求标准差 .max() 求极

    2024年01月21日
    浏览(33)
  • 每天一个数据分析题(一百六十)

    以下关于代码片段(使用sklearn)的使用和PCA(主成分分析)的描述中,哪项是正确的? A. preprocessing.scale(data)用于对数据进行归一化处理,确保PCA分析前各特征处于同一量级。 B. PCA(n_components=9)将数据降维了9个主成分。 C. pca.explained_variance_输出的是降维后各主成分的方差。

    2024年02月20日
    浏览(38)
  • 每天一个数据分析题(二百九十六)

    订单详情表是以每一笔订单的每一件商品为最小业务记录单位进行记录的,那么可能成为订单详情表的主键字段的是? A. 订单编号 B. 产品编号 C. 订单ID D. 订单编号+产品编号 题目来源于CDA模拟题库 点击此处获取答案 cda数据分析考试:点击进入

    2024年04月27日
    浏览(30)
  • 每天一个数据分析题(一百六十四)

    关于OLAP系统,下列选项不正确的是() A. 是基于数据仓库的信息进行分析处理过程 B. 用户数量相对较少,其用户主要是业务决策人员与管理人员 C. 对响应时间要求非常高。 D. 基础数据来源于生产系统的操作数据,也就是说,OLAP系统的数据来源与OLTP系统。 题目来源于CDA模

    2024年02月22日
    浏览(40)
  • 每天一个数据分析题(一百五十九)

    主成分分析(PCA)不适宜单独用于哪种情况? A. 员工绩效的评估和排名 B. 描述产品情况,如子公司的业务发展状况 C. 消除数据分析中的共线性问题 D. PCA可以作为异常识别的算法使用 题目来源于CDA模拟题库 点击此处获取答案

    2024年02月20日
    浏览(38)
  • Hadoop mapreduce课程设计-全球历史平均气温数据分析

    文章目录 前言 一、工具介绍 二、mapreduce数据处理 1.数据集准备  2.要求:对不同洲的平均温度处理--得到各大洲的平均温度 2.1 mapper阶段 2.2 reduce阶段 2.3 分区 2.4 Driver阶段 3.结果展示  4.将数据放入mongodb数据库 4.1 ktr展示 4.2 mongodb数据展示 ​编辑  5.使用pandas和pyecharts将数据

    2024年02月03日
    浏览(35)
  • 【数据分析面试】10. 计算平均通勤时间(SQL:timestampdiff() 和datediff()区别)

    假设你在Uber工作。 rides 表包含了关于Uber用户在美国各地的行程信息。 编写一个查询,以获取纽约(NY)每位通勤者的平均通勤时间(以分钟为单位),以及纽约所有通勤者的平均通勤时间(以分钟为单位)。 示例: 输入: rides 表 列名 类型 id INTEGER commuter_id INTEGER start_dt

    2024年04月09日
    浏览(74)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包