美文网首页
尚硅谷大数据技术之HBase

尚硅谷大数据技术之HBase

作者: 尚硅谷教育 | 来源:发表于2018-12-13 17:10 被阅读71次

8.2.8 移除(取关)用户
a、在微博用户关系表中,对当前主动操作的用户移除取关的好友(attends)
b、在微博用户关系表中,对被取关的用户移除粉丝
c、微博收件箱中删除取关的用户发布的微博
代码:public void removeAttends(String uid, String... attends)
/**

  • 取消关注(remove)

  • a、在微博用户关系表中,对当前主动操作的用户删除对应取关的好友

  • b、在微博用户关系表中,对被取消关注的人删除粉丝(当前操作人)

  • c、从收件箱中,删除取关的人的微博的rowkey
    */
    public void removeAttends(String uid, String... attends){
    //过滤数据
    if(uid == null || uid.length() <= 0 || attends == null || attends.length <= 0) return;
    HConnection connection = null;

    try {
    connection = HConnectionManager.createConnection(conf);
    //a、在微博用户关系表中,删除已关注的好友
    HTableInterface relationsTBL = connection.getTable(TableName.valueOf(TABLE_RELATIONS));

     //待删除的用户关系表中的所有数据
     List<Delete> deletes = new ArrayList<Delete>();
     //当前取关操作者的uid对应的Delete对象
     Delete attendDelete = new Delete(Bytes.toBytes(uid));
     //遍历取关,同时每次取关都要将被取关的人的粉丝-1
     for(String attend : attends){
         attendDelete.deleteColumn(Bytes.toBytes("attends"), Bytes.toBytes(attend));
         //b
         Delete fansDelete = new Delete(Bytes.toBytes(attend));
         fansDelete.deleteColumn(Bytes.toBytes("fans"), Bytes.toBytes(uid));
         deletes.add(fansDelete);
     }
     
     deletes.add(attendDelete);
     relationsTBL.delete(deletes);
     
     //c、删除取关的人的微博rowkey 从 收件箱表中
     HTableInterface recTBL = connection.getTable(TableName.valueOf(TABLE_RECEIVE_CONTENT_EMAIL));
     
     Delete recDelete = new Delete(Bytes.toBytes(uid));
     for(String attend : attends){
         recDelete.deleteColumn(Bytes.toBytes("info"), Bytes.toBytes(attend));
     }
     recTBL.delete(recDelete);
    

    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    8.2.9 获取关注的人的微博内容
    a、从微博收件箱中获取所关注的用户的微博RowKey
    b、根据获取的RowKey,得到微博内容
    代码实现:public List<Message> getAttendsContent(String uid)
    /**

  • 获取微博实际内容

  • a、从微博收件箱中获取所有关注的人的发布的微博的rowkey

  • b、根据得到的rowkey去微博内容表中得到数据

  • c、将得到的数据封装到Message对象中
    */
    public List<Message> getAttendsContent(String uid){
    HConnection connection = null;
    try {
    connection = HConnectionManager.createConnection(conf);
    HTableInterface recTBL = connection.getTable(TableName.valueOf(TABLE_RECEIVE_CONTENT_EMAIL));
    //a、从收件箱中取得微博rowKey
    Get get = new Get(Bytes.toBytes(uid));
    //设置最大版本号
    get.setMaxVersions(5);
    List<byte[]> rowkeys = new ArrayList<byte[]>();
    Result result = recTBL.get(get);
    for(Cell cell : result.rawCells()){
    rowkeys.add(CellUtil.cloneValue(cell));
    }
    //b、根据取出的所有rowkey去微博内容表中检索数据
    HTableInterface contentTBL = connection.getTable(TableName.valueOf(TABLE_CONTENT));
    List<Get> gets = new ArrayList<Get>();
    //根据rowkey取出对应微博的具体内容
    for(byte[] rk : rowkeys){
    Get g = new Get(rk);
    gets.add(g);
    }
    //得到所有的微博内容的result对象
    Result[] results = contentTBL.get(gets);

     List<Message> messages = new ArrayList<Message>();
     for(Result res : results){
         for(Cell cell : res.rawCells()){
             Message message = new Message();
             
             String rowKey = Bytes.toString(CellUtil.cloneRow(cell));
             String userid = rowKey.substring(0, rowKey.indexOf("_"));
             String timestamp = rowKey.substring(rowKey.indexOf("_") + 1);
             String content = Bytes.toString(CellUtil.cloneValue(cell));
             
             message.setContent(content);
             message.setTimestamp(timestamp);
             message.setUid(userid);
             
             messages.add(message);
         }
     }
     return messages;
    

    } catch (IOException e) {
    e.printStackTrace();
    }finally{
    try {
    connection.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    return null;
    }

本教程由尚硅谷教育大数据研究院出品,如需转载请注明来源,欢迎大家关注尚硅谷公众号(atguigu)了解更多。

相关文章

网友评论

      本文标题:尚硅谷大数据技术之HBase

      本文链接:https://www.haomeiwen.com/subject/cmubhqtx.html