共享单车之数据存储

文章目录

  • 第1关:获取工作簿中的数据
  • 第2关:保存共享单车数据


第1关:获取工作簿中的数据

相关知识
获取工作簿中的信息,我们可以使用Java POI(POI是一个提供API给Java程序对Microsoft Office格式档案读和写的功能)提供的Workbook类来操作。

为了完成本关任务,你需要掌握:如何获取Wookbook的数据。

读取一个Wookbook中数据
读取工作簿中的内容大致分为下列几个步骤:

使用WorkbookFactory新建一个工作簿(Wookbook)
InputStream resourceAsStream = SaveData.class.getClassLoader().getResourceAsStream(“data.xls”);//通过类加载器获取本地文件
Workbook workbook = WorkbookFactory.create(resourceAsStream);
获取给定索引处的Sheet对象。
Sheet sheet = workbook.getSheetAt(0);//拿到Wookbook中的第一个Sheet
说明:一个Wookbook中可能存在多个Sheet,因此需要指定索引,如下图:

通过Sheet对象获取指定行和行内单元格。
Row row = sheet.getRow(1);//首行一般为说明,因此我们直接从第一行进行获取
Cell cell = row.getCell(0);//获取当前行第一个单元格
获取单元格中的值。

上图观察表结构数据trip_id为数字类型,时间为字符类型,在获取数据时我们必须遵循类型规则,对应获取。

//1.获取第一行中trip_id列的第一个值(33404951)
double numericCellValue = row.getCell(0).getNumericCellValue();
DecimalFormat formatter = new DecimalFormat(“########”);//一个#表示一个数字
String trip_id =formatter.format(numericCellValue);//我们需要使用DecimalFormat将数据格式化
//2.获取第一行中开始时间单元格的值
FastDateFormat instance = FastDateFormat.getInstance(“MM/dd/yyyy HH:mm”);
String beginTimeValue = row.getCell(1).getStringCellValue();
//为了方便后面的数据分析计算我们将需要将时间格式转为时间戳
long begintime = instance.parse(beginTimeValue).getTime();
//3.获取第一行开始经度单元格的值
double start_longitude = row.getCell(7).getNumericCellValue();
DecimalFormat formatter = new DecimalFormat(“###.######”);//#表示一个数字,不包括0
String longitude = formatter.format(start_longitude);
获取当前sheet中的物理定义行数
//为了完整的将整个Sheet中的数据全部存储,我们需要知道整个Sheet中有多少条数据,然后对其遍历
int rows = sheet.getPhysicalNumberOfRows();
编程要求
在右侧编辑器Begin-End中补充代码,获取data.xls文件中的数据,具体获取以下数据并将结果打印:trip_id、开始时间、结束经度、车辆id。

文件数据格式如下:

trip_id 开始时间 结束时间 车辆id 出发地 目的地 所在城市 开始经度 开始纬度 结束经度 结束纬度
33404951 7/1/2017 0:09 7/1/2017 0:45 5996 韩庄村北782米 韩庄村北782米 河北省保定市雄县 39.043732 116.260139 39.043732 116.260139
33463211 7/1/2017 1:01 7/1/2017 11:13 6342 韩庄村北782米 39.043732 116.260139 NA NA
33415440 7/1/2017 1:59 7/1/2017 2:12 6273 擎天矿用材料有限公司北609米 河北省保定市雄县G45(大广高速) 河北省保定市雄县G45(大广高速) 39.041691 116.235352 39.044701 116.252441
注意:表中有非法数据,我们在获取时为了避免出错或者获取到空的数据,可以使用try-catch将其抛出。

测试说明
平台会对你编写的代码进行测试:

测试输入:无;
预期输出:
骑行id:33404951,开始时间:1498838940000,车辆id:5996,结束经度:39.043732
骑行id:33415440,开始时间:1498845540000,车辆id:6273,结束经度:39.044701

开始你的任务吧,祝你成功!
示例代码如下:

package com.educoder.savedata;
import java.io.InputStream;
import java.text.DecimalFormat;
import org.apache.commons.lang3.time.FastDateFormat;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
public class SaveWookbook {public static void main(String[] args) throws Exception {/******** **    Begin    ****** ****///1.通过类加载器获取本地文件并新建一个工作簿InputStream resourceAsStream = SaveWookbook.class.getClassLoader().getResourceAsStream("data.xls");Workbook workbook = WorkbookFactory.create(resourceAsStream);//2.拿到工作簿中第一个SheetSheet sheet = workbook.getSheetAt(0);//3.获取当前Sheet中的行数int rows = sheet.getPhysicalNumberOfRows();//4.对所有有效数据进行遍历并输出(期间无效数据通过异常捕获方式清除)for (int n = 1; n < rows; n++) {Row row = sheet.getRow(n);//通过异常方式清除格式不准确、数据不存在的无效行try {//trip_idDecimalFormat formatter1 = new DecimalFormat("########");String trip_id = formatter1.format(row.getCell(0).getNumericCellValue());//开始时间FastDateFormat instance = FastDateFormat.getInstance("MM/dd/yyyy HH:mm");String beginTimeValue = row.getCell(1).getStringCellValue();long begintime = instance.parse(beginTimeValue).getTime();//车辆idint car_id = (int)row.getCell(3).getNumericCellValue();//结束经度double start_longitude = row.getCell(9).getNumericCellValue();DecimalFormat formatter2 = new DecimalFormat("###.######");//#表示一个数字,不包括0String longitude = formatter2.format(start_longitude);System.out.println("骑行id:"+trip_id+",开始时间:"+begintime+",车辆id:"+car_id+",结束经度:"+longitude);} catch (Exception e) {}}/******** **    End    ******* ***/}
}

在这里插入图片描述

第2关:保存共享单车数据

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

如何创建HBase表;
如何读取文件;
了解共享单车数据表格式以及如何获取数据;
如何存储到HBase。
如何创建HBase表
com.util.HBaseUtil类封装了对应的创建Hbase表方法createTable

示例如下:

HBaseUtil.createTable(“t_shared_bicycle”, “info”);//创建拥有一个列族的info的表t_shared_bicycle,一个列族可拥有任意数量的列。
获取本地文件
文件存放目录为src/main/resources,我们可以通过类加载器加载共享单车数据文件dataResources.xls:

InputStream resourceAsStream = SaveData.class.getClassLoader().getResourceAsStream(“dataResources.xls”);
共享单车数据结构和获取
dataResources.xls文件格式如下:

trip_id 开始时间 结束时间 车辆id 出发地 目的地 所在城市 开始经度 开始纬度 结束经度 结束纬度
33404951 7/1/2017 0:09 7/1/2017 0:45 5996 韩庄村北782米 韩庄村北782米 河北省保定市雄县 39.043732 116.260139 39.043732 116.260139
33404950 7/1/2017 0:11 7/1/2017 0:45 5777 河北省保定市雄县G45(大广高速) 乡里乡情铁锅炖东499米 河北省保定市雄县 39.044159 116.251579 39.04652 116.237411
33404947 7/1/2017 1:59 7/1/2017 2:12 6342 韩庄村北782米 韩庄村北782米 河北省保定市雄县 39.043732 116.260139 39.043732 116.260139
如何存储到HBase
com.util.HBaseUtil类封装了对应的批量存储到Hbase表方法putByTable。示例如下:

List puts = new ArrayList<>();// 一个PUT代表一行数据,每个Put有唯一的ROWKEY
Put put = new Put(Bytes.toBytes(“33404951”)); //创建ROWKEY为33404951的PUT
byte[] family = Bytes.toBytes(“info”);
put.addColumn(family,Bytes.toBytes(“bicycleId”), Bytes.toBytes(String.valueOf(5996)));//在列族info中,增加字段名称为bicycleId,值为5996的元素
put.addColumn(family,Bytes.toBytes(“departure”), Bytes.toBytes(“韩庄村北782米”));//在列族info中,增加字段名称为departure,值为韩庄村北782米的元素
puts.add(put);
HBaseUtil.putByTable(“t_shared_bicycle”,puts);//批量保存数据到t_shared_bicycle
编程要求
根据提示,在右侧编辑器Begin-End中补充savaBicycleData方法,完成如下操作:

创建拥有列族info的表t_shared_bicycle;
将唯一骑行trip_id设为表的ROWKEY;
将出发地 = 目的地或者目的地 = 所在城市的无效数据清除;
把文件dataResources.xls中相应的数据存到Hbase表t_shared_bicycle中。
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
提示:注意使用try-catch将无效数据或非法数据进行抛出。

测试说明
平台会对你编写的代码进行测试,数据量较大,评测时间可能较长,请耐心等待:

测试输入:37785165
预期输出:
rowCount–>331850
info:beginTime 1501500120000
info:bicycleId 6280
info:city 河北省保定市雄县
info:departure 东方红家园西南121米
info:destination 沙辛庄村南940米
info:endTime 1501500840000
info:start_latitude 116.13826
info:start_longitude 39.144981
info:stop_latitude 116.13237
info:stop_longitude 39.13525

说明:由于数据过多,我们将输出ROWKEY为37785165的信息。

开始你的任务吧,祝你成功!
示例代码如下:

package com.educoder.savedata;
import java.io.InputStream;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.apache.commons.lang3.time.FastDateFormat;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import com.educoder.util.HBaseUtil;
/* 
* 读取共享单车城市行车数据
* 
*/
public class SaveData {public static void SaveBicycleData()  throws Exception {/******** **   Begin   ******* ***/HBaseUtil.createTable("t_shared_bicycle", "info");InputStream resourceAsStream = SaveData.class.getClassLoader().getResourceAsStream("dataResources.xls");Workbook workbook = WorkbookFactory.create(resourceAsStream);Sheet sheet = workbook.getSheetAt(0);int rows = sheet.getPhysicalNumberOfRows();List<Put> puts = new ArrayList<Put>();for (int n = 1; n < rows; n++) {// 通过异常方式清除格式不准确、数据不存在的无效行try {Row row = sheet.getRow(n);// 唯一骑行id,当作行rowkeyDecimalFormat formatter1 = new DecimalFormat("########");String trip_id = formatter1.format(row.getCell(0).getNumericCellValue());Put put = new Put(Bytes.toBytes(trip_id));byte[] family = Bytes.toBytes("info");// 开始时间FastDateFormat instance = FastDateFormat.getInstance("MM/dd/yyyy HH:mm");String beginTimeValue = row.getCell(1).getStringCellValue();Date parse = instance.parse(beginTimeValue);put.addColumn(family, Bytes.toBytes("beginTime"), Bytes.toBytes(String.valueOf(parse.getTime())));// 结束时间String endTimeValue = row.getCell(2).getStringCellValue();Date parse2 = instance.parse(endTimeValue);put.addColumn(family, Bytes.toBytes("endTime"), Bytes.toBytes(String.valueOf(parse2.getTime())));// 单车识别码int bicycleId = (int)row.getCell(3).getNumericCellValue();put.addColumn(family, Bytes.toBytes("bicycleId"), Bytes.toBytes(String.valueOf(bicycleId)));// 出发地String departure = row.getCell(4).getStringCellValue();put.addColumn(family, Bytes.toBytes("departure"), Bytes.toBytes(departure));// 目的地String destination = row.getCell(5).getStringCellValue();put.addColumn(family, Bytes.toBytes("destination"), Bytes.toBytes(destination));// 所在城市String city = row.getCell(6).getStringCellValue();put.addColumn(family, Bytes.toBytes("city"), Bytes.toBytes(city));// 清除目的地 = 所在城市 或者 出发地 = 目的地 的无效数据if (destination.equals(city)|| departure.equals(destination) ) {continue;}//开始经度DecimalFormat formatter2 = new DecimalFormat("###.######");String start_longitude = formatter2.format(row.getCell(7).getNumericCellValue());put.addColumn(family, Bytes.toBytes("start_longitude"), Bytes.toBytes(String.valueOf(start_longitude)));//开始纬度String start_latitude = formatter2.format(row.getCell(8).getNumericCellValue());put.addColumn(family, Bytes.toBytes("start_latitude"), Bytes.toBytes(String.valueOf(start_latitude)));//结束经度String stop_longitude = formatter2.format(row.getCell(9).getNumericCellValue());put.addColumn(family, Bytes.toBytes("stop_longitude"), Bytes.toBytes(String.valueOf(stop_longitude)));//结束纬度String stop_latitude = formatter2.format(row.getCell(10).getNumericCellValue());put.addColumn(family, Bytes.toBytes("stop_latitude"), Bytes.toBytes(String.valueOf(stop_latitude)));puts.add(put);} catch (Exception e) {}}HBaseUtil.putByTable("t_shared_bicycle", puts);/****** ****   End   ****** ****/}
}

在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/585580.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习笔记:R语言基础

文章目录 一、R语言简介二、选择R的原因三、R基本数据对象&#xff08;一&#xff09;向量&#xff08;二&#xff09;矩阵&#xff08;三&#xff09;数组&#xff08;四&#xff09;因子&#xff08;五&#xff09;列表&#xff08;六&#xff09;数据框&#xff08;七&#…

07-项目打包 React Hooks

项目打包 项目打包是为了把整个项目都打包成最纯粹的js&#xff0c;让浏览器可以直接执行 打包命令已经在package.json里面定义好了 运行命令&#xff1a;npm run build&#xff0c;执行时间取决于第三方插件的数量以及电脑配置 打包完之后再build文件夹下&#xff0c;这个…

【unity学习笔记】配置模型,实现眨眼和口型效果

一、vriod捏人 1.在vroidstudio软件中捏人 2.导出模型&#xff08;.vrm) 二、vrid导入unity的插件 1.在Git上搜索、打开univrm。 2.找到release页面找到合适的插件版本。&#xff08;VRM-0.116.0_0f6c&#xff09; 3.将univrm导入到工程中&#xff08;assets&#xff09;。 三…

查看IOS游戏FPS

摘要 本篇技术博客将介绍如何使用克魔助手工具来查看iOS游戏的帧率&#xff08;FPS&#xff09;。通过克魔助手&#xff0c;开发者可以轻松监测游戏性能&#xff0c;以提升用户体验和游戏质量。 引言 在iOS游戏开发过程中&#xff0c;了解游戏的帧率对于优化游戏性能至关重要…

第一届能源电子产业创新大赛太阳能光伏赛道在京顺利完成初赛评审

近日&#xff0c;第一届能源电子产业创新大赛太阳能光伏赛道初赛在北京顺利举行。本次太阳能光伏赛道赛事由工业和信息化部产业发展促进中心、宜宾市人民政府主办&#xff0c;宜宾市经济和信息化局、宜宾高新技术产业园区承办&#xff0c;中国国检测试控股集团股份有限公司协办…

【 C语言 】| C程序百例 - 绘制余弦曲线

【 C语言 】| C程序百例 - 绘制余弦曲线 时间&#xff1a;2023年12月29日12:56:29 文章目录 【 C语言 】| C程序百例 - 绘制余弦曲线1.要求2.问题分析与算法设计3.程序3-1.源码3-2.makefile 4.运行 1.要求 在屏幕上用"*"显示0~360的余弦曲线cos(x)曲线。 2.问题分析与…

代码随想录刷题 | Day1

今日学习目标 一、基础 数组 array类 模板类vector 数组是存放在连续内存空间上的相同类型数据的集合。 数组可以方便的通过下标索引的方式获取到下标下对应的数据。 需要两点注意的是 数组下标都是从0开始的。 数组内存空间的地址是连续的 而且大家如果使用C的话&…

【AIGC表情prompt】提示词练习技巧

表情类提示词练习技巧 医疗机器人&#xff0c;男人笑脸景深&#xff0c;数据&#xff0c;座标&#xff0c;12k,c4d渲染&#xff0c;高分辨率&#xff0c;,暖色调&#xff0c;高清对比 医疗机器人&#xff0c;男人微笑&#xff0c;景深&#xff0c;数据&#xff0c;座标&#xf…

nginx日志常见报错解决

目录 一&#xff1a;报错 二&#xff1a;php查看后台内容有的栏目出现502&#xff1f; 三&#xff1a;413 Request Entity Too Large? 四&#xff1a;Request Header Or Cookie Too Large 400 一&#xff1a;报错 upstream prematurely closed connection while reading r…

【C语言数组传参】规则详解

目录 数组传参介绍 数组传参规则 数组传参的实参 特殊情况一&#xff1a;sizeof&#xff08;数组名&#xff09; 特殊情况二&#xff1a;&数组名 数组传参的形参 数组传参使用数组名作为形参接收 形参如果是⼀维数组 形参如果是⼆维数组 数组传参使用指针作为形参…

Linux:apache优化(1)—— 长链接/保持连接

系统:CentOS 7.9 apache版本为&#xff1a;2.4.25 需要使用源码包进行安装才能够使用这些扩展模块 在使用这些扩展模块前要先下载zlib-devel 安装--enable-deflate选项需要的网页压缩传输的软件包 yum -y install zlib-devel 在配置编译安装时需要使用扩展配置 ./config…

如何使用Docker将.Net6项目部署到Linux服务器(三)

目录 四 安装nginx 4.1 官网下载nginx 4.2 下载解压安装nginx 4.3 进行configure 4.4 执行make 4.5 查看nginx是否安装成功 4.6 nginx的一些常用命令 4.6.1 启动nginx 4.6.2 通过命令查看nginx是否启动成功 4.6.3 关闭Nginx 4.6.5 重启Nginx 4.6.6 杀掉所有Nginx进程 4.…

C# 使用ZXing.Net识别二维码和条码

目录 写在前面 代码实现 调用示例 写在前面 上一篇写了 C# 使用ZXing.Net生成二维码和条码-CSDN博客 使用ZXing.Net解码非常简单&#xff0c;事实上就只用一行代码就好了&#xff0c;这么简单那为什么还要贴在这里呢&#xff0c;原因是开始时&#xff0c;在网上看资料看到…

Linux 编写脚本定时发送天气预报

1 首先要配置smtp服务 我这里使用的是qq邮箱 拿到smtp的密钥 2 配置mail.rc文件 在配置文件末尾加上 set from109456****qq.com #这里是发送邮件的地址 set smtpsmtp.qq.com:587 #阿里云一定要带上这个端口号&#xff0c;其他云服务商不用 set smtp-auth-user109456**** #…

Mybatis行为配置之Ⅳ—日志

专栏精选 引入Mybatis Mybatis的快速入门 Mybatis的增删改查扩展功能说明 mapper映射的参数和结果 Mybatis复杂类型的结果映射 Mybatis基于注解的结果映射 Mybatis枚举类型处理和类型处理器 再谈动态SQL Mybatis配置入门 Mybatis行为配置之Ⅰ—缓存 Mybatis行为配置…

系统启动流程 - 理解modules加载流程

​编辑 Hacker_Albert    202 linux 启动流程module加载 1.启动过程分为三个部分 BIOS 上电自检&#xff08;POST&#xff09;引导装载程序 (GRUB2)内核初始化启动 systemd&#xff0c;其是所有进程之父。 1.1.BIOS 上电自检&#xff08;POST&#xff09; BIOS stands for…

图像拼接——基于homography的特征匹配算法

目录 1. 任务要求2. 数据集3. 基于homography的特征匹配算法4. 拼接流程展示4.1 图片实例4.2 特征点位图4.3 特征点匹配结果4.4 相机校准结果4.5 拼接结果 5. 部分图像拼接结果展示 1. 任务要求 输入&#xff1a;同一个场景的两张待拼接图像&#xff08;有部分场景重合&#x…

macOS系统打开Linux的方法

第一步 按下[command空格键]调出搜索框&#xff0c;输入“终端”&#xff0c;打开图上第一个 第二步 如图先输入"sudo -i"&#xff0c;敲回车键&#xff0c;再输入开机密码&#xff0c;再敲回车键就可以打开。注意&#xff1a;这里的密码输入不会显示在页面。 如果要…

JavaEE - 网络编程之回显服务器

目录 一.什么是回显服务器&#xff1f; 二.UDP是什么&#xff1f; 1.TCP 是有链接的&#xff0c; UDP 是无连接的 2.TCP是可靠传输的,UDP是不可靠传输的 3.TCP是面向字节流的&#xff0c;UDP是面向数据报 4.TCP和UDP是全双工的 三.UDP的 socket api 四. 具体代码实现 …

Qt Designer中各个模块的详细介绍,小白一看就会!!第3部分——Item Views (Model-Based) 模块介绍

Item Views (Model-Based) 模块的详细介绍 在Qt Designer中&#xff0c;Item Views (Model-Based) 模块是一组基于模型/视图&#xff08;Model/View&#xff09;架构的控件&#xff0c;用于展示和操作数据。这些控件与数据模型紧密结合&#xff0c;使得数据展示变得更加灵活和…