尚硅谷大数据技术之HBase
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)了解更多。