共享单车之数据存储

news2024/11/23 22:25:54

文章目录

  • 第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.拿到工作簿中第一个Sheet
        Sheet 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_id
                DecimalFormat 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();
                //车辆id
                int car_id = (int)row.getCell(3).getNumericCellValue();
                //结束经度
                double start_longitude = row.getCell(9).getNumericCellValue();
                DecimalFormat formatter2 = new DecimalFormat("###.######");//#表示一个数字,不包括0
                String 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,当作行rowkey
                DecimalFormat 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.coloradmin.cn/o/1343709.html

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

相关文章

使用Jenkins和单个模板部署多个Kubernetes组件

前言 在持续集成和部署中&#xff0c;我们通常需要部署多个实例或组件到Kubernetes集群中。通过Jenkins的管道脚本&#xff0c;我们可以自动化这个过程。在本文中&#xff0c;我将演示如何使用Jenkins Pipeline及单个YAML模板文件&#xff08;.tpl&#xff09;来部署多个类似的…

uni-appcss语法

锋哥原创的uni-app视频教程&#xff1a; 2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中..._哔哩哔哩_bilibili2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中...共计23条视频&#xff0c;包括&#xff1a;第1讲 uni…

【超图】SuperMap iClient3D for WebGL/WebGPU —— 坐标系位置 —— Cartesian2

作者&#xff1a;taco 说到关于地理必然逃不开位置的关系。借用百度百科的内容来说地理学&#xff08;geography&#xff09;&#xff0c;是研究地球表层空间地理要素或者地理综合体空间分布规律、时间演变过程和区域特征的一门学科。所以位置&坐标系必然逃不掉了。那么在S…

Vue2 - v-model 简介

目录 1&#xff0c;原理1.1&#xff0c;作用于表单元素1.2&#xff0c;作用于自定义组件 2&#xff0c;编译结果展示2.2&#xff0c;表单元素2.1&#xff0c;自定义组件 1&#xff0c;原理 官网参考 v-model 是一个语法糖&#xff0c;最终会生成一个属性和一个事件。并且即可…

OpenCV数字图像处理——基于目标边缘适用于目标部分遮挡或不同光照模板匹配

简介 模板匹配是一种常见的计算机视觉问题&#xff0c;通常用于在一张图像中查找特定的模板图像。在处理模板匹配时&#xff0c;经常会面临对象的姿态未知的情况&#xff0c;其中姿态包括位置&#xff08;X&#xff0c;Y坐标&#xff09;和旋转角度&#xff08;θ&#xff09;…

RIP路由协议配置实验

实验目的&#xff1a; &#xff08;1&#xff09;理解RIP路由的原理&#xff1b; &#xff08;2&#xff09;掌握RIP路由的配置方法 实验器材&#xff1a; Cisco packet 实验内容&#xff1a; 实验步骤&#xff1a; &#xff08;1&#xff09;布置拓扑&#xff1a; &…

新品出击 | 软网关BLIoTLink免费发布

新品出击|软网关BLIoTLink免费发布 BLIoTLink是一款免费的物联网协议转换软件&#xff0c;可以部署在任何基于Linux OS的系统&#xff08;Linux、Debian、Ubuntu、FreeRTOS、RT-Thread&#xff09;中&#xff0c;使用灵活&#xff0c;可以实现数据的采集以及接入网络平台。 BL…

关于 K8s 的一些基础概念整理

〇、前言 Kubernetes&#xff0c;将中间八个字母用数字 8 替换掉简称 k8s&#xff0c;是一个开源的容器集群管理系统&#xff0c;由谷歌开发并维护。它为跨主机的容器化应用提供资源调度、服务发现、高可用管理和弹性伸缩等功能。 下面简单列一下 k8s 的几个特性&#xff1a; 自…

PostgreSQL 作为向量数据库:入门和扩展

PostgreSQL 拥有丰富的扩展和解决方案生态系统&#xff0c;使我们能够将该数据库用于通用人工智能应用程序。本指南将引导您完成使用 PostgreSQL 作为向量数据库构建生成式 AI 应用程序所需的步骤。 我们将从pgvector 扩展开始&#xff0c;它使 Postgres 具有特定于向量数据库…

基于js和html的骰子游戏

介绍&#xff1a; 1.游戏者选择“大”时&#xff0c;三个骰子点数之和为11-18时&#xff0c;游戏者获胜。2.游戏者选择“小”时&#xff0c;三个骰子点数之和为3-10时&#xff0c;游戏者获胜。3.如果游戏者选择具体点数&#xff0c;则根据三个骰子的点数计算&#xff0c;如果与…

【Linux系统编程二十五】:线程概念(Linux中的轻量级进程)

【Linux系统编程二十五】&#xff1a;线程概念(Linux中的轻量级进程&#xff09; 一.线程的概念1.地址空间是资源窗口 二.线程初步理解1.进程执行分支(内部运行)2.执行粒度更细3.重构进程概念&#xff1a;系统资源分配的基本实体4.重构线程概念&#xff1a;系统调度的基本单位5…

TCP/IP的网络层(即IP层)之IP地址和网络掩码,在视频监控系统中的配置和应用

在给客户讲解我们的AS-V1000视频监控平台的时候&#xff0c;有的客户经常会配置错误IP地址的掩码和网关&#xff0c;导致出现一些网路问题。而在视频监控系统中&#xff0c;IP地址和子网掩码是用于标识网络中设备的重要标识符。IP地址被用来唯一地标识一个网络设备&#xff0c;…

ubuntu下编译obs-studio遇到的问题记录

参考的是这篇文档&#xff1a;Build Instructions For Linux obsproject/obs-studio Wiki GitHub 在安装OBS dependencies时&#xff0c; sudo apt install libavcodec-dev libavdevice-dev libavfilter-dev libavformat-dev libavutil-dev libswresample-dev libswscale-d…

如何在 NAS 上安装 ONLYOFFICE 文档?

文章作者&#xff1a;ajun 导览 ONLYOFFICE 文档 是一款开源办公套件&#xff0c;其是包含文本文档、电子表格、演示文稿、表单、PDF 查看器和转换工具的协作性编辑工具。它高度兼容微软 Office 格式&#xff0c;包括 .docx、.xlsx 、.pptx 、pdf等文件格式&#xff0c;并支持…

再见2023,你好2024

再见2023&#xff0c;你好2024 生活1月 悲伤与治愈2~4月 运动与偏爱5月 体验与美食6月 婚礼与热爱7~8月 就医与别离9~11月 陪伴与暖房12月 体验&新生 运动追剧读书总结 生活 生活是一个修罗场&#xff0c;来世间一场&#xff0c;要经历丰腴有趣的人生。去体验各种滋味&…

我的机器学习起步如何Getting Started

学习技巧和原则 先通过经典书籍进行科普知名机器学习网站根据书籍或网站的目录&#xff0c;先泛读、再选择有兴趣的部分重点精读、后至于反复读知行合一 起步Getting Started 周志华版《机器学习》&#xff0c;又名西瓜书 可以作为科普书籍&#xff0c;需要主动略过对于理论…

搭建flink集群 —— 筑梦之路

Apache Flink 是一个框架和分布式处理引擎&#xff0c; 用于在无边界和有边界数据流上进行有状态的计算。 Flink 能在所有常见集群环境中运行&#xff0c;并能以内存速度和任意规模进行计算。 Flink并没有依靠自身实现所有分布式系统需要解决的问题&#xff0c; 而是在已有集群…

vue连接本地服务器

vue 连接本地服务器做后端。 后端服务 使用springboot新建一个基于restful的接口&#xff0c;访问如下的地址&#xff0c;返回值。 vue构建 新建一个vue项目&#xff0c;安装访问服务器的插件。 npm install axios vue-axios --save 修改main.js使用axios&#xff0c;最终…

Linux 内核学习笔记: hlist 的理解

前言 最近阅读 Linux 内核时&#xff0c;遇到了 hlist&#xff0c;这个 hlist 用起来像是普通的链表&#xff0c;但是为何使用 hlist&#xff0c;hlist 是怎么工作的&#xff1f; 相关代码 hlist_add_head(&clk->clks_node, &core->clks); /*** clk_core_link_…

很实用的ChatGPT网站——httpchat-zh.com

很实用的ChatGPT网站——http://chat-zh.com/ 今天介绍一个好兄弟开发的ChatGPT网站&#xff0c;网址[http://chat-zh.com/]。这个网站功能模块很多&#xff0c;包含生活、美食、学习、医疗、法律、经济等很多方面。下面简单介绍一些部分功能与大家一起分享。 登录和注册页面…