您的位置:首页 > 新闻 > 资讯 > 上海搜索引擎优化_办理咨询公司需要什么条件_人工智能的关键词_百度收录怎么查询

上海搜索引擎优化_办理咨询公司需要什么条件_人工智能的关键词_百度收录怎么查询

2025/6/5 17:54:18 来源:https://blog.csdn.net/qq_74326393/article/details/146442322  浏览:    关键词:上海搜索引擎优化_办理咨询公司需要什么条件_人工智能的关键词_百度收录怎么查询
上海搜索引擎优化_办理咨询公司需要什么条件_人工智能的关键词_百度收录怎么查询

HBase作为分布式列式数据库,其数据类型的处理方式与传统关系型数据库存在根本性差异。以下从底层存储机制、数据类型映射、应用层处理三个维度,结合实例详细说明其特性:


一、HBase原生存储特性

核心原则:HBase所有数据以 字节数组(byte[]) 形式存储,无原生数据类型系统。
底层存储结构

KeyValue = RowKey + ColumnFamily:Qualifier + Timestamp + Value(byte[])

实例解析
当存储学生成绩记录{rowkey="S001", info:math=90}时,实际存储结构为:

RowKey: "S001" → byte[4] = [0x53,0x30,0x30,0x31]  
Column: "info:math" → byte[9] = [0x69,0x6e,0x66,0x6f,0x3a,0x6d,0x61,0x74,0x68]  
Value: 90 → byte[4] = [0x00,0x00,0x00,0x5a]

特殊维度 - 时间戳

  • 本质为64位长整型(Unix时间戳的毫秒数)
  • 支持多版本存储(同一单元格不同时间戳的多个值)
    实例
hbase> put 'student','S001','info:math', 85, 1700000000000  
hbase> put 'student','S001','info:math', 90, 1700000001000

此时查询S001的数学成绩,默认返回最新时间戳的数据(90),但可通过指定时间戳获取历史值.


二、数据类型映射实践

虽然HBase原生不定义数据类型,但通过客户端工具可实现类型语义化。以下是常见映射方式:

1. 基础类型转换(以Java API为例)
逻辑类型序列化方法反序列化方法
IntegerBytes.toBytes(int)Bytes.toInt(byte[])
LongBytes.toBytes(long)Bytes.toLong(byte[])
DoubleBytes.toBytes(double)Bytes.toDouble(byte[])
StringBytes.toBytes(String)Bytes.toString(byte[])
BooleanBytes.toBytes(boolean)Bytes.toBoolean(byte[])
DateBytes.toBytes(date.getTime())new Date(Bytes.toLong(byte[]))

应用实例:存储学生信息

Put put = new Put(Bytes.toBytes("S001"));
put.addColumn(Bytes.toBytes("info"), Bytes.toBytes("age"), Bytes.toBytes(20)); // 整数类型
put.addColumn(Bytes.toBytes("info"), Bytes.toBytes("gpa"),Bytes.toBytes(3.75)); // 浮点型
put.addColumn(Bytes.toBytes("status"), Bytes.toBytes("graduated"), Bytes.toBytes(true)); // 布尔型
2. 复合类型处理

场景:存储JSON对象或二进制文件

// 序列化JSON
String json = "{'courses':['math','cs'], 'score':92}";
put.addColumn(Bytes.toBytes("doc"), Bytes.toBytes("profile"), Bytes.toBytes(json));// 存储图片
FileInputStream fis = new FileInputStream("photo.jpg");
byte[] imageData = IOUtils.toByteArray(fis);
put.addColumn(Bytes.toBytes("attachment"), Bytes.toBytes("photo"), imageData);
3. 枚举类型实现
enum Department { CS, MATH, PHYSICS }// 存储时转换为序数
put.addColumn(Bytes.toBytes("info"), Bytes.toBytes("dept"), Bytes.toBytes(Department.CS.ordinal()));// 读取时还原
int ordinal = Bytes.toInt(cell.getValue());
Department dept = Department.values()[ordinal];

三、第三方工具的类型扩展
1. Apache Phoenix

提供SQL层类型映射支持:

CREATE TABLE student (id VARCHAR PRIMARY KEY,age INTEGER,gpa DOUBLE,graduated BOOLEAN
);

此时插入UPSERT INTO student VALUES ('S001',20,3.75,true),Phoenix自动完成类型转换.

2. Hive集成

通过Hive-HBase Handler实现类型映射:

CREATE EXTERNAL TABLE hbase_student (key string,age int,gpa double
) STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,info:age#b,info:gpa#b"
);

其中#b表示二进制转换.

3. Informatica数据集成

通过预定义类型映射规则实现ETL:

<Field name="age" type="INT" hbase:column="info:age"/>
<Field name="birthdate" type="DATE" hbase:column="info:dob"/>

工具自动处理Java的Date.getTime()与HBase字节数组的转换.


四、特殊数据类型场景
1. 版本化数据存储

实例:存储股票价格历史

// 不同时间戳写入同一单元格
put.addColumn(Bytes.toBytes("price"), Bytes.toBytes("AAPL"), 1700000000000L, Bytes.toBytes(150.2));
put.addColumn(Bytes.toBytes("price"), Bytes.toBytes("AAPL"), 1700000001000L, Bytes.toBytes(152.3));

通过Get.setTimeRange()可查询特定时间段的价格.

2. 计数器类型

专用incrementColumnValue方法实现原子计数:

Table table = connection.getTable(TableName.valueOf("page_views"));
table.incrementColumnValue(Bytes.toBytes("homepage"), Bytes.toBytes("stats"), Bytes.toBytes("visit_count"), 1L
);

此操作保证分布式环境下的原子性.

3. 地理空间数据

通过GeoMesa等扩展库实现:

SimpleFeatureType sft = ... // 定义空间类型
GeoMesaDataStore ds = new GeoMesaHBaseDataStore(hbaseConf, "geodata");
ds.createSchema(sft); // 自动创建空间索引列族

五、数据类型最佳实践
  1. 显式类型标注
    在列名中加入类型提示:info:age_intscore_double

  2. 统一序列化协议
    推荐使用Protocol Buffers或Avro进行复杂对象序列化:

    message Student {required int32 age = 1;optional double gpa = 2;
    }
    
    Student stu = Student.newBuilder().setAge(20).setGpa(3.75).build();
    put.addColumn(..., stu.toByteArray());
    
  3. 编码一致性

    • 所有字符串统一用UTF-8编码
    • 数值类型采用大端序存储
  4. 版本控制策略
    对模式演进敏感的列族,存储schema版本号:

    put.addColumn(..., "schema_version", Bytes.toBytes(2));
    
  5. 元数据管理
    建立独立的meta列族存储类型元信息:

    put.addColumn("meta", "info:age_type", Bytes.toBytes("int"));
    put.addColumn("meta", "info:gpa_precision", Bytes.toBytes("double:2"));
    

总结对比

特性HBase传统RDBMS
原生类型支持无,均为字节数组强类型系统
类型扩展性通过客户端自由扩展固定类型集
存储效率依赖序列化优化固定类型存储
多版本支持内置时间戳维度需额外设计
模式灵活性动态列支持固定表结构

通过合理设计类型映射策略,HBase能够支撑从简单标量到复杂对象的全类型数据存储需求,其灵活性在物联网时序数据、用户行为日志等场景中展现独特优势。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com