面试题答案
一键面试表结构设计
- 行键(Row Key):
- 设计行键时,可以将用户标识和时间戳组合起来。例如,采用
user_id + timestamp
的格式(假设user_id
为固定长度以便于排序和查找),并且时间戳采用倒序存储(如将大的时间戳放在前面)。这样在HBase按行键排序时,最新的数据会排在前面。
- 设计行键时,可以将用户标识和时间戳组合起来。例如,采用
- 列族(Column Family):
- 可以创建一个列族,比如命名为
log
。将所有与操作日志相关的列都放在这个列族下,如操作类型、操作详情等列。
- 可以创建一个列族,比如命名为
- 列(Column):
- 除了时间戳作为其中一个列的属性外,其他列用于记录操作的具体信息,如操作类型(如登录、点击等),操作详情(如点击的链接等)。时间戳作为列的属性(qualifier)有助于在检索时利用HBase对列的属性过滤功能。
HBase操作实现快速检索
- 扫描(Scan)操作:
- 使用
Scan
对象来检索数据。 - 设置起始行键:计算出一周前的时间戳,结合用户标识构造起始行键。例如,假设一周前的时间戳为
old_timestamp
,用户标识为user1
,则起始行键为user1 + old_timestamp
(按设计的行键格式)。 - 设置结束行键:为当前用户标识加上一个比当前时间戳稍大的值(可以是当前时间戳加上一个极小的增量,确保能包含所有当前时间的数据),如
user1 + current_timestamp + small_increment
。 - 通过设置
Scan
对象的setStartRow
和setStopRow
方法来限定扫描范围。 - 还可以利用
Scan
的addColumnFamily
方法指定只扫描log
列族的数据,以减少数据读取量。
- 使用
- 时间戳过滤(Timestamp Filter):
- 虽然行键设计能初步筛选出大致时间范围的数据,但为了更精确,还可以使用时间戳过滤器。在扫描时,通过
Scan
的setTimeRange
方法设置时间范围为最近一周,这样即使行键范围稍大,也能通过时间戳过滤得到准确的数据。
- 虽然行键设计能初步筛选出大致时间范围的数据,但为了更精确,还可以使用时间戳过滤器。在扫描时,通过
通过以上表结构设计和HBase操作,可以实现快速检索最近一周内用户的操作记录。