gitweixin
  • 首页
  • 小程序代码
    • 资讯读书
    • 工具类
    • O2O
    • 地图定位
    • 社交
    • 行业软件
    • 电商类
    • 互联网类
    • 企业类
    • UI控件
  • 开发博客
  • bug清单
  • 大数据开发
    • Hadoop
    • Spark
    • Hbase
    • Kafka

分类归档Hbase

精品微信小程序开发门户,代码全部亲测可用

  • 首页   /  大数据开发
  • 分类归档: "Hbase"
Hbase 10月 26,2020

Hbase使用过滤器Filter例子

使用过滤器Filter

功能简介

HBase Filter主要在Scan和Get过程中进行数据过滤,通过设置一些过滤条件来实现,如设置RowKey、列名或者列值的过滤条件。

代码样例

以下代码片段在com.huawei.bigdata.hbase.examples包的“HBaseSample”类的testSingleColumnValueFilter方法中。

public void testSingleColumnValueFilter() {    
LOG.info("Entering testSingleColumnValueFilter.");
Table table = null;
ResultScanner rScanner = null;
try {
table = conn.getTable(tableName);
Scan scan = new Scan();
scan.addColumn(Bytes.toBytes("info"), Bytes.toBytes("name"));
// Set the filter criteria.
SingleColumnValueFilter filter = new SingleColumnValueFilter( Bytes.toBytes("info"), Bytes.toBytes("name"), CompareOp.EQUAL, Bytes.toBytes("Xu Bing"));
scan.setFilter(filter);
// Submit a scan request.
rScanner = table.getScanner(scan);
// Print query results.
for (Result r = rScanner.next(); r != null; r = rScanner.next()) { for (Cell cell : r.rawCells()) { LOG.info(Bytes.toString(CellUtil.cloneRow(cell)) + ":" + Bytes.toString(CellUtil.cloneFamily(cell)) + "," + Bytes.toString(CellUtil.cloneQualifier(cell)) + "," + Bytes.toString(CellUtil.cloneValue(cell))); } } LOG.info("Single column value filter successfully."); } catch (IOException e) {
LOG.error("Single column value filter failed " ,e);
} finally {
if (rScanner != null) {
// Close the scanner object.
rScanner.close();
}
if (table != null) {
try {
// Close the HTable object.
table.close();
} catch (IOException e) {
LOG.error("Close table failed " ,e);
}
}
}
LOG.info("Exiting testSingleColumnValueFilter.");
}

注意事项

当前二级索引不支持使用SubstringComparator类定义的对象作为Filter的比较器。

例如,如下示例中的用法当前不支持:

Scan scan = new Scan();
filterList = new FilterList(FilterList.Operator.MUST_PASS_ALL);
filterList.addFilter(new SingleColumnValueFilter(Bytes
.toBytes(columnFamily), Bytes.toBytes(qualifier),
CompareOp.EQUAL, new SubstringComparator(substring)));
scan.setFilter(filterList);
作者 east
bug清单, Hbase 6月 10,2020

华为FusionInsight HD集群Can’t get Kerberos realm

华为FusionInsight HD采用安全登录认证的方式,但是一直报Can’t get kerberos realm的错误,反复检查hbase的安全认证没问题,但线上运行就会时不时出现这个问题。

经过反复对比排查,发现是另个地方redis,也用到安全认证,但把配置文件写错导致失败。而想不到的是,redis安全认证失败,也导致了hbase这里安全认证失败。

作者 east
Hbase 5月 24,2020

hbase常用查询命令

根据rowKey查询某个记录

get <table>,<rowkey>,[<family:column>,….]

get ‘User’, ‘row2’


查询所有记录

(1)正序扫描

scan <table>, {COLUMNS => [ <family:column>,…. ], LIMIT => num}

scan ‘User’

(2)倒序扫描

scan ‘table’, {REVERSED => TRUE}

(3)扫描前2条

scan ‘User’, {LIMIT => 2}

(4)范围查询

scan ‘User’, {STARTROW => ‘row2’, ENDROW => ‘row2’}

作者 east
Hbase 4月 24,2020

hbase常用查询命令

根据rowKey查询某个记录

get <table>,<rowkey>,[<family:column>,….]

get ‘User’, ‘row2’


查询所有记录

(1)正序扫描

scan <table>, {COLUMNS => [ <family:column>,…. ], LIMIT => num}

scan ‘User’

(2)倒序扫描

scan ‘table’, {REVERSED => TRUE}

(3)扫描前2条

scan ‘User’, {LIMIT => 2}

(4)范围查询scan ‘User’, {STARTROW => ‘row2’, ENDROW => ‘row2’}

作者 east
Hbase 1月 1,2020

hbase的常用操作工具类


public class HbaseUtil {

private static SimpleDateFormat parse = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

private static Configuration conf = null;

static{
setConf();
}

private static void setConf(){
conf = HBaseConfiguration.create();
String userDir = System.getProperty("user.dir") + File.separator + "conf" + File.separator;
Path hconf_path = new Path(userDir + "conf.xml");
conf.addResource(hconf_path);
}

public static Connection getConn() throws IOException {
return ConnectionFactory.createConnection(conf);
}

/**
* 该方法用于关闭表和connection的连接
*
@param table
*
@param conn
*/
private static void closeSource(Table table, Connection conn,ResultScanner scanner){
try {
if(table != null) table.close();
if (conn != null) conn.close();
if (scanner != null) scanner.close();
} catch (IOException e) {
e.printStackTrace();
}
}

/**
* 轨迹查询:根据表名 mac 起始时间 结束时间查询
*
@param tableName
*
@param mac
*
@param startTime
*
@param endTime
*
@return
* @throws IOException
*/
public static ResultScanner scan(String tableName, String mac, long startTime, long endTime) throws IOException {
Connection conn = null;
Table table = null;
ResultScanner scanner = null;
try {
conn = HbaseUtil.getConn();
table = conn.getTable(TableName.valueOf(tableName));
Scan scan = new Scan();

byte[] startRow = (mac + startTime).getBytes();
byte[] endRow = (mac + endTime).getBytes();

scan.setStartRow(startRow);
scan.setStopRow(endRow);

scanner = table.getScanner(scan);
return scanner;
}catch (Exception e){
e.printStackTrace();
}finally {
closeSource(table,conn,scanner);
}
return null;
}
}
作者 east
Hbase 1月 1,2020

如何使用hbase行键过滤器RowFilter

RowFilter是用来对rowkey进行过滤的,比较符如下:

OperatorDescription
LESS小于
LESS_OR_EQUAL小于等于
EQUAL等于
NOT_EQUAL不等于
GREATER_OR_EQUAL大于等于
GREATER大于
NO_OP排除所有

ComparatorDescription
BinaryComparator使用Bytes.compareTo()比较
BinaryPrefixComparator和BinaryComparator差不多,从前面开始比较
NullComparatorDoes not compare against an actual value but whether a given one is null, or not null.
BitComparatorPerforms a bitwise comparison, providing a BitwiseOp class with AND, OR, and XOR operators.
RegexStringComparator正则表达式
SubstringComparator把数据当成字符串,用contains()来判断

提取rowkey以01结尾数据
Filter filter = new RowFilter(CompareFilter.CompareOp.EQUAL,new RegexStringComparator(“.*01$”));

提取rowkey以包含201407的数据
Filter filter = new RowFilter(CompareFilter.CompareOp.EQUAL,new SubstringComparator(“201407”));

提取rowkey以123开头的数据
Filter filter = new RowFilter(CompareFilter.CompareOp.EQUAL,new BinaryPrefixComparator(“123”.getBytes()));


						
作者 east
Hbase 1月 1,2020

hbase的行键(rowkey)设计体会

rowkey设计有以下几个原则
1、长度越短越好 
2、唯一性 
3、散列性 

1、如果是查询某个特征值的轨迹,rowkey可以这样设计考虑

唯一标识+时间戳,这样就很快遍历(Scan)出轨迹。

2、如果经常要查询某一段时间内的所有的特征值,row就要考虑这样:

时间戳+唯一标识。

作者 east
Hbase 12月 14,2018

利用JavaAPI来操作Hbase

例子采用的是完全分布式集群,不是hbase自带的zookeeper,是独立的zookeeper

mvn的依赖如下:

<dependency>
    <groupId>org.apache.hbase</groupId>
    <artifactId>hbase-client</artifactId>
    <version>1.4.8</version>
</dependency>

<dependency>
    <groupId>org.apache.hbase</groupId>
    <artifactId>hbase-server</artifactId>
    <version>1.4.8</version>
</dependency>
在hbase中创建表、插入数据、查询数据等操作

import java.text.SimpleDateFormat
import java.util

import hbase.TestHbaeJavaApi.conf
import org.apache.hadoop.hbase.{HBaseConfiguration, TableName}
import org.apache.hadoop.hbase.client._
import org.apache.hadoop.hbase.filter.CompareFilter.CompareOp
import org.apache.hadoop.hbase.filter.{FilterList, SingleColumnValueFilter}
import org.apache.hadoop.hbase.util.Bytes

/**
  * 利用JavaAPI来操作Hbase
  */
object HBaseTool {
  val zkQuorum = "192.168.0.219"
  val port = "2181"
  val table = "test"
  val cf = "cf1"
  val config = HBaseConfiguration.create()
  config.set("hbase.zookeeper.property.clientPort", "2181")
  config.set("hbase.zookeeper.quorum", "192.168.0.219")
  config.set("hbase.master", "192.168.0.219:600000")

  def putData(rowKey:String, cf:String = cf, kv:Seq[(String,String)]): Put ={
    val put = new Put(Bytes.toBytes(rowKey))
    kv.foreach{ kv =>
      put.addColumn(Bytes.toBytes(cf), Bytes.toBytes(kv._1), Bytes.toBytes(kv._2))
    }
    put
  }

  def getData(rowKey:String, qualifier:String =null): Get={
    val get = new Get(Bytes.toBytes(rowKey))
    if(qualifier != null)
      get.addColumn(Bytes.toBytes(cf), Bytes.toBytes(qualifier))
    get
  }

  def getScan(startRow:String, stopRow:String, filters:Map[String,String]= null, columns:Seq[String]= null): Scan= {
    var filterList: FilterList = null
    val scan = new Scan()
      .setStartRow(Bytes.toBytes(startRow))
      .setStopRow(Bytes.toBytes(stopRow))

    if(filters != null){
      filterList = getFilters(filters)
      if(filterList.getFilters.size() > 0)
        scan.setFilter(filterList)
    }

    if(columns != null) {
      columns.foreach{ column =>
        scan.addColumn(Bytes.toBytes(cf), Bytes.toBytes(column))
      }
    }

    scan
  }

  def getFilters(kv:Map[String,String]): FilterList = {
    val filterList = new FilterList()
    kv.toSeq.foreach{ kv =>
      val filter = new SingleColumnValueFilter(
        Bytes.toBytes(cf),
        Bytes.toBytes(kv._1),
        CompareOp.EQUAL,
        Bytes.toBytes(kv._2)
      )
      filter.setFilterIfMissing(true)
      filterList.addFilter(filter)
    }
    filterList
  }

  def main(args: Array[String]): Unit = {
    val rowKey = new SimpleDateFormat("yyyy-MM-dd").format(System.currentTimeMillis())
    val testSchema = Seq("id","name","age")
    val testData = Seq("10001","Jack","22")
    /**
      * 1. 插入数据到HBase
      */
    val hTable: HTable = new HTable(config, TableName.valueOf(table))
    hTable.setAutoFlush(false)
    hTable.setWriteBufferSize(10 * 1024 * 1024)
    //处理任务功能
    hTable.put(putData(rowKey, cf=cf, testSchema zip testData))

    hTable.flushCommits()

    /**
      * 2. 通过Get查询HBase
      */
    val result: Result = hTable.get(getData(rowKey))
    for(kv <- result.raw()) {
      println("key="+Bytes.toString(kv.getQualifier)+", value="+Bytes.toString(kv.getValue))
    }

    val result1: Result = hTable.get(getData(rowKey, testSchema.toList(2)))
    for(kv <- result1.raw()) {
      println("value="+Bytes.toString(kv.getValue))
    }

    /**
      * 3. 通过Scan查询HBase
      */
    val scan = getScan(rowKey, rowKey)
    val resultScan: ResultScanner = hTable.getScanner(scan)
    val ite: util.Iterator[Result] = resultScan.iterator()
    while(ite.hasNext) {
      val result = ite.next()
      for(kv <- result.raw()) {
        println("rowKey="+Bytes.toString(kv.getRow)+", key="+Bytes.toString(kv.getQualifier)+", value="+Bytes.toString(kv.getValue))
      }
    }

    hTable.close()
  }



}

 

作者 east

标签

flex布局 github mysql O2O UI控件 不含后台 交流 体育 共享经济 出行 单机类 图像 地图定位 外卖 多媒体 娱乐 小程序 布局 带后台完整项目 开源项目 搜索 支付 效率 教育 旅游 日历 时钟 流量主 物流 用户系统 电商 画图 画布(canvas) 社交 签到 算命 联网 装修 解锁 评论 读书 读音 资讯 阅读 预订

官方QQ群

1群:74052405

薅羊毛交流群: 952493060

近期文章

  • android http请求带中文参数会乱码(url编码)
  • mysql主从复制
  • 修改my.ini导致启动不了服务
  • Android聊天输入框控件
  • Android直播间刷礼物动画控件
  • Android自定义交易密码框
  • Android记录文件日志工具类
  • Android常用图片操作工具类
  • Android倒计时工具类
  • Android压缩解压工具

文章归档

  • 2021年一月
  • 2020年十二月
  • 2020年十一月
  • 2020年十月
  • 2020年九月
  • 2020年八月
  • 2020年七月
  • 2020年六月
  • 2020年五月
  • 2020年四月
  • 2020年三月
  • 2020年二月
  • 2020年一月
  • 2019年七月
  • 2019年六月
  • 2019年五月
  • 2019年四月
  • 2019年三月
  • 2019年二月
  • 2019年一月
  • 2018年十二月
  • 2018年七月
  • 2018年六月

分类目录

  • Android (30)
  • bug清单 (26)
  • Fuchsia (15)
  • php (1)
  • python (2)
  • 人工智能 (1)
  • 大数据开发 (119)
    • Elasticsearch (6)
    • Flink (3)
    • Hadoop (11)
    • Hbase (8)
    • Hive (1)
    • Java (27)
    • Kafka (1)
    • solr (1)
    • Spark (42)
    • spring (8)
    • 数据仓库 (1)
    • 数据挖掘 (5)
    • 运维 (4)
  • 小游戏代码 (1)
  • 小程序代码 (111)
    • O2O (15)
    • UI控件 (3)
    • 互联网类 (17)
    • 企业类 (5)
    • 地图定位 (9)
    • 多媒体 (5)
    • 工具类 (19)
    • 电商类 (18)
    • 社交 (5)
    • 行业软件 (7)
    • 资讯读书 (7)
  • 开发博客 (5)
  • 数据库 (2)
  • 未分类 (6)

功能

  • 登录
  • 文章RSS
  • 评论RSS
  • WordPress.org

All Rights Reserved by Gitweixin.本站收集网友上传代码, 如有侵犯版权,请发邮件联系yiyuyos@gmail.com删除.