在这里是简单模拟将索引存到redis中,再通过先查询索引再将Hbase中的数据查询出来。

需要考虑的问题:

  1、建立redis的连接,建立Hbase的连接

  2、如何创建索引,即创建索引的key和value的设计

  3、如何通过将查到的索引,去查询到对应Hbase的数据

代码的难度并不大,主要是这个思路。

package com.wyh.redis;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HTableDescriptor;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import redis.clients.jedis.Jedis; import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Set; /**
* 通过存在redis的索引查询Hbase的数据
*/
public class HbaseOnRediseIndex {
private HConnection conn;
private HBaseAdmin admin;
private Jedis jedis; /**
* 初始化建立连接
* 连接Hbase,连接到redis
*
*/
@Before
public void Cli(){
try {
//建立与Hbase的连接
Configuration conf = new Configuration();
conf.set("hbase.zookeeper.quorum","master:2181,node1:2181,node2:2181");
conn = HConnectionManager.createConnection(conf);
admin = new HBaseAdmin(conf); //建立与redis的连接
jedis = new Jedis("master", 6379);
System.out.println("与Hbase建立连接成功。。"+conn);
System.out.println("与redis建立连接成功。。"+jedis); } catch (IOException e) {
e.printStackTrace();
}
} /**
* 创建表将学生信息导入到Hbase中
*
*/
@Test
public void createTable(){
try {
HTableDescriptor student2 = new HTableDescriptor("student2");
HColumnDescriptor info = new HColumnDescriptor("info"); student2.addFamily(info); String name = Bytes.toString(student2.getName()); admin.createTable(student2); System.out.println(name+"表 创建成功。。。");
} catch (IOException e) {
e.printStackTrace();
} } /**
* 往创建的Hbase表中put数据
*/
@Test
public void putData(){
try {
ArrayList<Put> puts = new ArrayList<>(); HTableInterface student2 = conn.getTable("student2");
BufferedReader br = new BufferedReader(new FileReader("D:\\shujia\\shujia006\\hadoop\\src\\data\\students.txt"));
String line;
while ((line=br.readLine())!=null){
String[] split = line.split(",");
String id = split[0];
String name = split[1];
String age = split[2];
String gender = split[3];
String clazz = split[4]; Put put = new Put(id.getBytes());
put.add("info".getBytes(),"name".getBytes(),name.getBytes());
put.add("info".getBytes(),"age".getBytes(),age.getBytes());
put.add("info".getBytes(),"gender".getBytes(),gender.getBytes());
put.add("info".getBytes(),"clazz".getBytes(),clazz.getBytes()); puts.add(put);
} student2.put(puts);
System.out.println("数据插入完毕。。。"); } catch (IOException e) {
e.printStackTrace();
}
} /**
* 读取数据,将学号插入到redis当作索引
* set集合的方式
*
*/
@Test
public void setData(){
try {
String tableName = "student_gender";
BufferedReader br = new BufferedReader(new FileReader("D:\\shujia\\shujia006\\hadoop\\src\\data\\students.txt"));
String line;
while ((line=br.readLine())!=null){
String[] split = line.split(",");
String id = split[0]; String gender = split[3];
String key = tableName +":" + gender;
jedis.sadd(key,id);
} System.out.println("redis索引构建完毕。。。"); } catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} /**
* 通过redis的索引查询Hbase的数据
* 先查询索引表,再查询Hbase
*
*/
@Test
public void indexData(){ String gender = "男"; Set<String> set = jedis.smembers("student_gender:" + gender); System.out.println("所有性别为 "+ gender+" 的学生如下:");
for (String id : set) { try {
HTableInterface student2 = conn.getTable("student2");
Get get = new Get(id.getBytes()); Result result = student2.get(get);
if(result!=null){
String id1 = Bytes.toString(result.getRow());
String name = Bytes.toString(result.getValue("info".getBytes(), "name".getBytes()));
String age = Bytes.toString(result.getValue("info".getBytes(), "age".getBytes()));
String gander1 = Bytes.toString(result.getValue("info".getBytes(), "gender".getBytes()));
String clazz = Bytes.toString(result.getValue("info".getBytes(), "clazz".getBytes())); System.out.println(id1+"\t"+name+"\t"+age+"\t"+gander1+"\t"+clazz);
} } catch (IOException e) {
e.printStackTrace();
} } } /**
* 关闭连接
*/
@After
public void close(){
if(admin!=null){
try {
admin.close();
} catch (IOException e) {
e.printStackTrace();
} }
if(conn!=null){
try {
conn.close();
} catch (IOException e) {
e.printStackTrace();
} }
if(jedis!=null){
jedis.close();
} } }

大数据之路Week10_day07 (JavaAPI 操作Redis 与Hbase建立索引,通过查询redis中的索引查询Hbase数据)的更多相关文章

  1. 如何用Apache POI操作Excel文件-----如何在已有的Excel文件中插入一行新的数据?

    在POI的第一节入门中,我们提供了两个简单的例子,一个是如何用Apache POI新建一个工作薄,另外一个例子是,如果用Apache POI新建一个工作表.那么在这个章节里面,我将会给大家演示一下,如 ...

  2. sql 查询表格中多列重复的数据并显示该表的其他列

    我们一般情况下通过分组函数group by来查询重复的列 ) R 但是查询出的结果不能显示该表的其他列 想要查询一张表中有多个列重复的数据且也要显示该表的其他列 SELECT M.* FROM [db ...

  3. SQL-游标-查询数据库中的所有表的数据个数

    --sql语句-游标等使用 ) ) declare @i INT ) declare @cstucount INT --上方设置变量 --初始值 declare mCursor cursor --设置 ...

  4. SqlServer 在查询结果中如何过滤掉重复数据

    问题背景 在一个多表查询的sql中正常情况下产生的数据都是唯一的,但因为数据库中存在错误(某张表中存在相同的外键ID)导致我这边查询出来的数据就会有重复的问题 下面结果集中UserID:15834存在 ...

  5. 查询Oracle中字段名带"."的数据

    SDE中的TT_L线层会有SHAPE.LEN这样的字段,使用: SQL>select shape.len from tt_l; 或 SQL>select t.shape.len from ...

  6. mysql查询sql中检索条件为大批量数据时处理

    当userIdArr数组值为大批量时,应如此优化代码实现

  7. java中多个线程访问共享数据的方式有哪些

    多个线程对共同数据的访问的实现,要根据情况而定 (1)当访问共同的代码的时候:可以使用同一个Runnable对象,这个Runnable对象中有这个共享数据,比如卖票系统就可以这么做.或者这个共享数据封 ...

  8. laravel如何从mysql数据库中随机抽取n条数据

    laravel如何从mysql数据库中随机抽取n条数据 一.总结 一句话总结: inRandomOrder():$userQuestions=UserQuestion::where($map)-> ...

  9. Python之路:Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy

    Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度 ...

  10. 胖子哥的大数据之路(6)- NoSQL生态圈全景介绍

    引言: NoSQL高级培训课程的基础理论篇的部分课件,是从一本英文原著中做的摘选,中文部分参考自互联网.给大家分享. 正文:  The NoSQL Ecosystem 目录 The NoSQL Eco ...

随机推荐

  1. Linux 网络设置及管理

    Linux 网络管理 网络管理 1.使用NetworkManager管理网络 NetworkManager(网络管理器)是一个动态网络的控制器与配置系统,它用于当网络设备可用时保持设备连接和开启并激活 ...

  2. java正则表达式(find()和 matches())

    1.find()方法是部分匹配,是查找输入串中与模式匹配的子串,如果该匹配的串有组还可以使用group()函数. matches()是全部匹配,是将整个输入串与模式匹配,如果要验证一个输入的数据是否为 ...

  3. Qt编写的项目作品9-音频综合应用示例

    一.功能特点 自动计算音频振幅,绘制音频振幅曲线和音频数据曲线. 支持音频录制,可选音频输入设备.采样频率.通道等参数,Qt5默认保存wav格式,Qt6默认保存mp3格式,Qt6可选wma.aac等格 ...

  4. Qt编写的项目作品4-输入法V2019

    一.功能特点 未采用Qt系统层输入法框架,独创输入切换机制. 纯QWidget编写,支持任何目标平台(亲测windows.linux.嵌入式linux等),支持任意Qt版本(亲测Qt4.6.0到Qt5 ...

  5. Unix和Windows操作系统中路径中的正斜杠和反斜杠的区别

  6. [转]使用navicat将excel文件导入mysql数据库

    excel: 注: 1.mysql里建立一张跟excel一样的表结构的表(包含id) 2.excel最好没有任何格式,只是纯值,不然会出现导入不了的错误 ----------------------- ...

  7. 即时通讯技术文集(第39期):推送技术合集(Part1) [共18篇]

    为了更好地分类阅读 52im.net 总计1000多篇精编文章,我将在每周三推送新的一期技术文集,本次是第 39 期. [- 1 -] iOS的推送服务APNs详解:设计思路.技术原理及缺陷等 [链接 ...

  8. 融云技术分享:基于WebRTC的实时音视频首帧显示时间优化实践

    本文由融云技术团队原创投稿,作者是融云WebRTC高级工程师苏道,转载请注明出处. 1.引言 在一个典型的IM应用里,使用实时音视频聊天功能时,视频首帧的显示,是一项很重要的用户体验指标. 本文主要通 ...

  9. DVWA靶场Command Injection(命令注入) 漏洞low(低),medium(中等),high(高)所有级别通关教程及源码审计

    命令注入 命令注入漏洞是一种安全漏洞,攻击者可以通过向应用程序输入恶意命令,诱使系统执行这些命令,从而达到未授权访问.数据篡改.系统控制等目的.该漏洞通常出现在应用程序未对用户输入进行充分验证和清理时 ...

  10. 可扩展系统——基于SPI扩展

    一.我们为什么讨论SPI? 为具有悠久历史的大型项目(屎山)添加新功能时,我们常常不太好评估变更的影响范围.因为原系统不具备良好的扩展性,导致修改整体发散,且不易单测.此时可以考虑使用接口来描述业务逻 ...