当前位置:   article > 正文

HBase数据库设计之RowKey_hbase 数据库设计之 rowkey 第1关:金融类 rowkey 设计

hbase 数据库设计之 rowkey 第1关:金融类 rowkey 设计

第1关:金融类RowKey设计

知识点

1.RowKey设计原则:唯一原则、排序原则、长度原则(越短越好)、散列原则

编程要求

根据提示,在右侧编辑器补充代码,完成以下需求:

  • 设计 RowKey

  • 完成查询某个卖家某段时间内的交易记录

  1. package step1;
  2. import org.apache.hadoop.conf.Configuration;
  3. import org.apache.hadoop.hbase.Cell;
  4. import org.apache.hadoop.hbase.CellUtil;
  5. import org.apache.hadoop.hbase.TableName;
  6. import org.apache.hadoop.hbase.client.*;
  7. import org.apache.hadoop.hbase.util.Bytes;
  8. import java.util.HashMap;
  9. import java.util.List;
  10. import java.util.Map;
  11. public class Task {
  12. /**
  13. * 生成 RowKey
  14. *
  15. * @param sellerId 卖家ID
  16. * @param timestamp 时间戳
  17. * @param orderId 订单ID
  18. * @return RowKey
  19. */
  20. public String createRowKey(String sellerId, String timestamp, String orderId) {
  21. /********** begin **********/
  22. String rowKey=sellerId+"-"+timestamp+"-"+orderId;
  23. return rowKey;
  24. /********** end **********/
  25. }
  26. /**
  27. * 查询某个卖家某段时间内的交易记录
  28. *
  29. * @param sellerId 卖家ID
  30. * @param startTimestamp 开始时间戳
  31. * @param endTimestamp 截止时间戳
  32. * @return map 存储 (rowkey,value)
  33. */
  34. public Map<String, String> findLogByTimestampRange(String sellerId, String startTimestamp, String endTimestamp) throws Exception {
  35. Map<String, String> map = new HashMap<>();
  36. /********** begin **********/
  37. Configuration conf=new Configuration();
  38. conf.set("hbase.zookeeper.quorum","127.0.0.1:2181");
  39. Connection connection=ConnectionFactory.createConnection(conf);
  40. Scan scan=new Scan();
  41. String startRow=sellerId+"-"+startTimestamp;
  42. String stopRow=sellerId+"-"+(endTimestamp+1);
  43. scan.withStartRow(startRow.getBytes());
  44. scan.withStopRow(stopRow.getBytes());
  45. Table table=connection.getTable(TableName.valueOf("deal"));
  46. ResultScanner scanner=table.getScanner(scan);
  47. for (Result result:scanner){
  48. String key = Bytes.toString(result.getRow());
  49. List<Cell> cells = result.listCells();
  50. for(Cell c:cells){
  51. String value = Bytes.toString(CellUtil.cloneValue(c));
  52. map.put(key, value);
  53. }
  54. }
  55. /********** end **********/
  56. return map;
  57. }
  58. }

第2关:车联网RowKey设计

知识点

1.避免热点的方法

(1)预分区

(2)加盐:给 RowKey 分配一个随机前缀以使得它和之前的 RowKey 的开头不同

(3)哈希:使同一行永远用一个前缀加盐

(4)反转:反转固定长度或者数字格式的RowKey,使得RowKey中经常改变的部分放在前面

(5)时间戳反转

编程要求

根据提示,在右侧编辑器补充代码,完成以下需求:

  • 使用 hash 避免热点问题 --> 前缀:prefix = substr(md5(uid),0 ,5)
  • 查询某辆车在某个时间范围的交易记录
  1. package step2;
  2. import org.apache.hadoop.conf.Configuration;
  3. import org.apache.hadoop.hbase.Cell;
  4. import org.apache.hadoop.hbase.CellUtil;
  5. import org.apache.hadoop.hbase.TableName;
  6. import org.apache.hadoop.hbase.client.*;
  7. import org.apache.hadoop.hbase.util.Bytes;
  8. import java.security.MessageDigest;
  9. import java.security.NoSuchAlgorithmException;
  10. import java.util.HashMap;
  11. import java.util.List;
  12. import java.util.Map;
  13. public class Task {
  14. static String[] chars = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"};
  15. /**
  16. * MD5 加密
  17. * @param str 需要加密的文本
  18. * @return 加密后的内容
  19. */
  20. public static String StringInMd5(String str) {
  21. MessageDigest md5 = null;
  22. try {
  23. md5 = MessageDigest.getInstance("md5");
  24. byte[] result = md5.digest(str.getBytes());
  25. StringBuilder sb = new StringBuilder(32);
  26. for (int i = 0; i < result.length; i++) {
  27. byte x = result[i];
  28. int h = 0x0f & (x >>> 4);
  29. int l = 0x0f & x;
  30. sb.append(chars[h]).append(chars[l]);
  31. }
  32. return sb.toString();
  33. } catch (NoSuchAlgorithmException e) {
  34. throw new RuntimeException(e);
  35. }
  36. }
  37. /**
  38. * 生成 row
  39. *
  40. * @param carId 汽车ID
  41. * @param timestamp 时间戳
  42. * @return rowkey
  43. */
  44. public String createRowKey(String carId, String timestamp) {
  45. /********** begin **********/
  46. String prefix = StringInMd5(carId);
  47. String rowKey = prefix.substring(0, 5) + "-" + carId + "-" + timestamp;
  48. return rowKey;
  49. /********** end **********/
  50. }
  51. /**
  52. * 查询某辆车在某个时间范围的交易记录
  53. *
  54. * @param carId 车辆ID
  55. * @param startTimestamp 开始时间戳
  56. * @param endTimestamp 截止时间戳
  57. * @return map 存储 (rowkey,value)
  58. */
  59. public Map<String, String> findLogByTimestampRange(String carId, String startTimestamp, String endTimestamp) throws Exception {
  60. Map<String, String> map = new HashMap<>();
  61. /********** begin **********/
  62. Configuration conf = new Configuration();
  63. conf.set("hbase.zookeeper.quorum", "127.0.0.1:2181");
  64. Connection connection = ConnectionFactory.createConnection(conf);
  65. Scan scan = new Scan();
  66. String startRow = createRowKey(carId, startTimestamp);
  67. String stopRow = createRowKey(carId, endTimestamp + 1);
  68. scan.withStartRow(startRow.getBytes());
  69. scan.withStopRow(stopRow.getBytes());
  70. Table table = connection.getTable(TableName.valueOf("deal"));
  71. ResultScanner scanner = table.getScanner(scan);
  72. for (Result result : scanner) {
  73. String key = Bytes.toString(result.getRow());
  74. List<Cell> cells = result.listCells();
  75. for (Cell c : cells) {
  76. String value = Bytes.toString(CellUtil.cloneValue(c));
  77. map.put(key, value);
  78. }
  79. }
  80. /********** end **********/
  81. return map;
  82. }
  83. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/510664
推荐阅读
相关标签
  

闽ICP备14008679号