问题:
需要查询某一用户某时间做了什么,PlatID和vopenid可以保证一个用户唯一,但同一时间同一用户可能日志有多条。
使用PlatID(int)、vopenid(int)和dtTime(datetime)查询
- 保持所有rowkey长度一致
PlatID总是一位,vopenid不一定,通过加一个很大的值,比如10000000000,保持位数固定 - 由于三属性结合不能保证rowid唯一
在原先rowed上加一定位数的随机数
体现在sql语句中:
select concat(concat(concat(concat(PlatID,'_'),concat(10000000000+vopenid,'_')),replace(dtTime,' ','-')), concat('_',100000+ceiling(rand() * 90000))) as id from log;
通过sqoop导出mysql数据到hbase:
sqoop import --driver com.mysql.jdbc.Driver --connect "jdbc:mysql://ip:port/dbname" --username root --password root --query "select concat(concat(concat(concat(PlatID,'_'),concat(10000000000+vopenid,'_')),replace(dtTime,' ','-')), concat('_',100000+ceiling(rand() * 90000))) as id,content,dtTime from log where 1=1 and $CONDITIONS" --hbase-table flog --column-family fl --hbase-row-key id -split-by dtTime -m 1
可以修改where条件语句,添加指定限制
此处会有dtTime的冗余,可以选择其他属性替换
改进:
select concat(concat(md5(concat(PlatID,vopenid)),unix_timestamp(dtEventTime)), 100000+ceiling(rand() * 90000))