大数据之路Week10_day01 (练习:通过设计rowkey来实现查询需求)
生活随笔
收集整理的這篇文章主要介紹了
大数据之路Week10_day01 (练习:通过设计rowkey来实现查询需求)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1、準備數據
鏈接:https://pan.baidu.com/s/1fRECXp0oWM1xgxc0uoniAA
提取碼:4k43
2、需求如下
(1)查詢出10條某個人的最近出現的位置信息
(2)查詢出某個人在某一天在某個城市的所有位置信息
3、設計rowkey
手機號_(某一個大值 - 進入位置的開始時間)
因為Hbase的rowkey是以字典順序來排序的,如果我們就直接將其存進去,是升序的,而要求是最新的位置信息,那么肯定是倒序的。
4、編寫連接、創建表、插入數據、查詢數據的代碼
package com.wyh.parctise; import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellUtil;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.filter.*;
import org.apache.hadoop.hbase.util.Bytes;
import org.junit.After;
import org.junit.Before;
import org.junit.Test; import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List; public class dianxin_Demo1 {
Configuration conf;
HConnection conn;
HBaseAdmin hBaseAdmin; @Before
public void Cline(){
try {
conf = new Configuration();
conf.set("hbase.zookeeper.quorum","master:2181,node1:2181,node2:2181");
conn = HConnectionManager.createConnection(conf);
hBaseAdmin = new HBaseAdmin(conf);
System.out.println("建立連接成功。。"+conn);
} catch (IOException e) {
e.printStackTrace();
}
} /**
* 創建表
*/
@Test
public void createTable(){
try {
//創建表
HTableDescriptor dianxin_1 = new HTableDescriptor("dianxin_1");
//設置表的列簇
HColumnDescriptor info = new HColumnDescriptor("info"); //將列簇加入到
dianxin_1.addFamily(info);
//通過Hmaster的對象進行創建表
hBaseAdmin.createTable(dianxin_1); System.out.println(Bytes.toString(dianxin_1.getName())+"表 創建完畢。。");
} catch (IOException e) {
e.printStackTrace();
}
} /**
* 往表中批量的插入數據
*/
@Test
public void putAllData(){
//定義一個ArrayList集合存Put實例
ArrayList<Put> puts = new ArrayList<>();
try {
//獲取到表的實例
HTableInterface dianxin_1 = conn.getTable("dianxin_1");
//讀取文件信息
BufferedReader br = new BufferedReader(new FileReader("D:\\shujia\\shujia006\\hadoop\\src\\data\\dianxin_data"));
String line;
while ((line=br.readLine())!=null){
//使用字符串的分割方法將其一行數據進行分割
String[] split = line.split(",");
if(!"\\N".equals(split[5])){
Long l = 20200000000000L-Long.parseLong(split[5]);
String startTime = String.valueOf(l); //將開始位置和手機號拼接作為rowkey
String rowkey = split[0]+"_"+startTime; String wg = split[1];
String cityID = split[2];
String qxID = split[3];
String stayTime = split[4];
String leaveTime = split[6];
String day = split[7]; //創建一個Put實例,將rowkey作為rowkey
Put put = new Put(rowkey.getBytes()); //將其他的字段作為列值加入
put.add("info".getBytes(),"wg".getBytes(),wg.getBytes());
put.add("info".getBytes(),"cityID".getBytes(),cityID.getBytes());
put.add("info".getBytes(),"qxID".getBytes(),qxID.getBytes());
put.add("info".getBytes(),"stayTime".getBytes(),stayTime.getBytes());
put.add("info".getBytes(),"leaveTime".getBytes(),leaveTime.getBytes());
put.add("info".getBytes(),"day".getBytes(),day.getBytes()); //將這個Put加入到puts集合中去
puts.add(put);
} } //將這個Put集合進行添加
dianxin_1.put(puts);
System.out.println(br.getClass().getName()+"文件數據加載完畢。。。"); //關閉輸入流
br.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} } /**
* 讀取一條數據
*/
@Test
public void getData(){
try {
//獲取到表的實例
HTableInterface dianxin_1 = conn.getTable("dianxin_1");
//創建get實例 提供一個行鍵
Long i = 20200000000000L - 20180503190539L;
String s1 = "D55433A437AEC8D8D3DB2BCA56E9E64392A9D93C_"+i;
Get get = new Get(s1.getBytes()); //通過調用get()方法來過去數據
Result result = dianxin_1.get(get); /**
* 第一種方式,已知列
*/
//調用getrow獲取二進制數組結果,再用Bytes工具類的toString()方法轉換為字符串
String id = Bytes.toString(result.getRow());
String[] split = id.split("_");
String pthone = split[0];
String startTime = split[1];
Long newstartTime = 20200000000000L-Long.parseLong(startTime); //調用返回結果的getValue()方法獲取到每個字段值
String wg = Bytes.toString(result.getValue("info".getBytes(), "wg".getBytes()));
String cityID = Bytes.toString(result.getValue("info".getBytes(), "cityID".getBytes()));
String qxID = Bytes.toString(result.getValue("info".getBytes(), "qxID".getBytes()));
String stayTime = Bytes.toString(result.getValue("info".getBytes(), "stayTime".getBytes()));
String leaveTime = Bytes.toString(result.getValue("info".getBytes(), "leaveTime".getBytes()));
String day = Bytes.toString(result.getValue("info".getBytes(), "day".getBytes())); //輸出到控制臺
System.out.println(pthone+"\t"+wg+"\t"+cityID+"\t"+qxID+"\t"+stayTime+"\t"+newstartTime+"\t"+leaveTime+"\t"+day); /**
* 第二種方式,未知列
*
* @deprecated as of 0.96, use {@link CellUtil#cloneValue(Cell)}
*/
List<Cell> cells = result.listCells();
String id1 = Bytes.toString(result.getRow());
String[] split1 = id1.split("_");
String pthone1 = split1[0];
String startTime1 = split1[1]; System.out.print(pthone1+"\t"+startTime1+"\t");
for (Cell cell : cells) {
String s = Bytes.toString(CellUtil.cloneValue(cell));
System.out.print(s);
System.out.print("\t");
}
} catch (IOException e) {
e.printStackTrace();
}
} /**
* 讀取某個人的最新10條位置信息
*/
@Test
public void scanData(){
try {
//獲取到表的實例
HTableInterface dianxin_1 = conn.getTable("dianxin_1");
//創建scan實例
Scan scan = new Scan(); //創建比較器 二進制前綴比較器
BinaryPrefixComparator binaryPrefixComparator1 = new BinaryPrefixComparator("47BE1E866CFC071DB19D5E1C056BE28AE24C16E7".getBytes());
RowFilter rowFilter = new RowFilter(CompareFilter.CompareOp.EQUAL, binaryPrefixComparator1); //創建一個過濾器集合
FilterList filterList = new FilterList();
//將多個過濾器加進去
filterList.addFilter(rowFilter); //添加過濾器
scan.setFilter(filterList); //獲取到scan結果集
ResultScanner scanner = dianxin_1.getScanner(scan); int count=0;
//遍歷這個結果集
Result result;
while ((result=scanner.next())!=null){
print(result);
count = count+1;
if(count==10){
break;
}
}
} catch (IOException e) {
e.printStackTrace();
} } /**
* 讀取某一天,某個人在某個城市的所有位置信息
*/
@Test
public void scanData1(){
try {
//獲取到表的實例
HTableInterface dianxin_1 = conn.getTable("dianxin_1");
//創建scan實例
Scan scan = new Scan(); //創建比較器 二進制前綴比較器
BinaryPrefixComparator binaryPrefixComparator1 = new BinaryPrefixComparator("47BE1E866CFC071DB19D5E1C056BE28AE24C16E7".getBytes());
RowFilter rowFilter = new RowFilter(CompareFilter.CompareOp.EQUAL, binaryPrefixComparator1); //包含比較器
SubstringComparator substringComparator = new SubstringComparator("20180503"); //創建一個過濾器 列值過濾器
SingleColumnValueFilter singleColumnValueFilter1 = new SingleColumnValueFilter("info".getBytes(), "day".getBytes(),
CompareFilter.CompareOp.EQUAL, substringComparator); //包含比較器
SubstringComparator substringComparator1 = new SubstringComparator("83401"); //創建一個過濾器 列值過濾器
SingleColumnValueFilter singleColumnValueFilter2 = new SingleColumnValueFilter("info".getBytes(), "cityID".getBytes(),
CompareFilter.CompareOp.EQUAL, substringComparator1); //創建一個過濾器集合
FilterList filterList = new FilterList();
//將多個過濾器加進去
filterList.addFilter(rowFilter);
filterList.addFilter(singleColumnValueFilter2);
filterList.addFilter(singleColumnValueFilter1); //添加過濾器
scan.setFilter(filterList); //獲取到scan結果集
ResultScanner scanner = dianxin_1.getScanner(scan); //遍歷這個結果集
Result result;
while ((result=scanner.next())!=null){
print(result);
}
scanner.close();
} catch (IOException e) {
e.printStackTrace();
} } /**
* 關閉Hbase的連接
*/
@After
public void close(){
/**
* 關閉hBaseAdmin
*/
for (int i = 0;i<5;i++){
System.out.println();
} if(hBaseAdmin!=null){
try {
hBaseAdmin.close();
System.out.println("hBaseAdmin連接已經關閉。。");
} catch (IOException e) {
e.printStackTrace();
}
} /**
* 關閉connection
*/
if(conn!=null){
try {
conn.close();
System.out.println("connection連接已經關閉。。");
} catch (IOException e) {
e.printStackTrace();
}
}
} public static void print(Result result){
String id = Bytes.toString(result.getRow());
String[] split = id.split("_");
String pthone = split[0];
String startTime = split[1];
Long newstartTime = 20200000000000L-Long.parseLong(startTime); //調用返回結果的getValue()方法獲取到每個字段值
String wg = Bytes.toString(result.getValue("info".getBytes(), "wg".getBytes()));
String cityID = Bytes.toString(result.getValue("info".getBytes(), "cityID".getBytes()));
String qxID = Bytes.toString(result.getValue("info".getBytes(), "qxID".getBytes()));
String stayTime = Bytes.toString(result.getValue("info".getBytes(), "stayTime".getBytes()));
String leaveTime = Bytes.toString(result.getValue("info".getBytes(), "leaveTime".getBytes()));
String day = Bytes.toString(result.getValue("info".getBytes(), "day".getBytes())); //輸出到控制臺
System.out.println(pthone+"\t"+wg+"\t"+cityID+"\t"+qxID+"\t"+stayTime+"\t"+newstartTime+"\t"+leaveTime+"\t"+day);
}
}
總結
以上是生活随笔為你收集整理的大数据之路Week10_day01 (练习:通过设计rowkey来实现查询需求)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Android Studio安装部署系
- 下一篇: Hadoop二次开发项目案例方案汇总