近日由于工作需要,需要对海量数据(1亿条)放入到redis中,于是开启了幸运(磨难)之旅。
一 旅途概述。
旅途目的:携带海量数据,并将海量数据运送到redis内存服务器
旅途意义:放入redis之后供其它系统模块查询
旅途装备:
硬货(硬件):ThinkPad x260笔记本一台、优盘一个、鼠标一个、水杯等(其它用品)若干。
软货(软件): redis服务、Windows7系统8G内存、eclipse、JDK、mysql数据库、海量数据、浏览器、互联网等
旅途过程:后面详述
旅途总结:1、顺利的开始不代表顺利的过程;
2、过程再难不代表没有办法;
3、一些看似简单的服务操作,当遇到大数据量是就有可能不简单
4、山外青山楼外楼
二 旅途沿途风景
2.1 主角亮相
本次的海量数据是全国基站信息数据库,数据包含的内容及说明如下。
字段名称 |
类型 |
取值范围 |
内容 |
备注 |
mcc |
整型 |
460 |
Mobile Country Code |
数据库中所有条目此字段均为460,如需压缩数据库存储空间可删除此字段 |
mnc |
整型 |
0,1,11,10000-20000 |
Mobile Network Code |
0表示移动基站 11表示电信LTE基站10000-20000表示电信CDMA基站,此时此字段的取值并非MNC,实际为电信SID |
lac |
整型 |
0-65535 |
Location Area Code |
对于电信CDMA基站,此字段的取值并非LAC,实际为电信NID |
ci |
整型 |
0-268435455 |
Cell ID |
对于WCDMA基站,此字段的取值为28位(二进制)的UTRAN Cell ID, |
lat |
浮点型 |
0.0-90.0 |
纬度 |
WGS84坐标 |
lon |
浮点型 |
0.0-180.0 |
经度 |
WGS84坐标 |
acc |
整型 |
0-10000 |
精度 |
以米为单位,表示基站覆盖半径 |
date |
整型 |
更新日期 |
||
validity |
浮点型 |
0.0-1.0 |
有效性 |
数值越大有效性越高 |
addr |
字符串 |
地址 |
地址描述字符串 |
|
province |
字符串 |
省 |
省/直辖市/自治区 |
|
city |
字符串 |
市 |
地级市/地区/自治州/盟 |
|
district |
字符串 |
区 |
县级市/县/市辖区/自治县/旗 |
|
township |
字符串 |
镇 |
镇/乡/街道 |
源数据为压缩文件,大小为4G左右,解压完为近20G,且数据为建表和插入的sql语句。鉴于sql文件格式不规范(相对于每条数据以特殊字符分割来说),所以计划先导入到数据库中再进行处理。
导入数据:
Cmd进入mysql安装目录的bin文件夹;
执行命令:mysql -utest -ptest -Ddbname < d:/sql/xxx.sql
导入开始…… 若干秒之后,报错了(当时没截图)
看错误的描述就是插入语句不合法,还有部分中文乱码。通过搜索得知,应该是字符集的问题(源数据中有中文),于是重新运行导入命令:
mysql -utest -ptest --default-character-set=utf8 -Dname < d:/sql/xxx.sql
导入开始…… 若干秒之后,导入成功。
至此,第一步算成功完成。
==========~~~~~~~~~~~====妖娆分割线======~~~~~~~~~~~~~~======
2.2 降妖除魔
接下来就真正开始了犯二与苦逼的过程。
使用本数据,是想通过基站的mnc,lac和ci三个值,查询对应的地理位置信息。通过对数据的分析,确定将mnc、lac和ci作为key,地理信息作为value放入redis。
犯二1:数据库直接到redis