前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >0822-HUE元数据库的desktop_document2表研究

0822-HUE元数据库的desktop_document2表研究

作者头像
Fayson
发布2020-12-14 14:50:18
1.6K0
发布2020-12-14 14:50:18
举报
文章被收录于专栏:Hadoop实操Hadoop实操

作者:是灏

背景

由于HUE中的数据过多,导致HUE运行很缓慢,经过查询,发现HUE元数据库中的desktopdocument2表很大,有几十万条数据,经过查看表结构发现,desktopdocument2中有一个字段lastmodified,值是一个时间戳,为了减轻HUE的负担,直接删除了lastmodified小于三个月前的所有数据,结果登陆HUE后发现HUE的收藏夹无法打开,并且所有的查询记录都无法显示了。

以下仅针对Hive和Impala的SQL

查询历史和收藏夹

在hue的desktopdocument2表中,存放了所有用户的查询历史和收藏夹,这两者是通过ishistory来区分的,所以is_history=1的数据可以放心直接删除,不会有任何影响

所有ishistory=0的数据为用户收藏夹数据,这些数据中包括了文件夹和实际收藏的SQL。如果parentdirectoryid是null,这条数据代表了一个文件夹,实际收藏的数据的parentdirectoryid字段指向了parentdirectory_id所在行的主键id

我以lastmodified小于某个值去删除,会导致代表parentdirectoryid本身的行被删除(因为所有的根文件夹都是随着用户建立而建立的,所以lastmodified都很老),因此所有的收藏夹数据无法找到索引,导致收藏夹和Saved Queries无法正常显示。

恢复方法为执行以下SQL

代码语言:javascript
复制
select distinct parent_directory_id,owner_id from hue.desktop_document2 where is_history=flase and parent_directory_id is not null and parent_directory_id not in (select id from hue.desktop_document2 )

找到所有丢失的parentdirectoryid和对应的ownerid,重新插入desktopdocument2表即可。除了parentdirectoryid和ownerid以外的其余字段随便找一条代表parentdirectory行的值填入即可。uuid可以用uuid()函数生成。SQL如下

代码语言:javascript
复制
insert into desktop_document2 (id,name,description,uuid,type,data,extra,last_modified,version,is_history,owner_id,parent_directory_id,search,is_trashed,is_managed)
select parent_directory_id,"","",uuid(),"directory",{}","","2020-09-20 10:10:10","1,0,owner_id,null,null,false,false
from 
select distinct parent_directory_id,owner_id from desktop_document2 where is_history=flase and parent_directory_id is not null and parent_directory_id not in (select id from hue.desktop_document2 ) a;

插入数据后,用户重新登入HUE,刷新后收藏夹和查询历史即恢复正常。

文收藏夹的回收站

经过上一步的操作,用户已经可以使用收藏夹,但是用户无法删除收藏夹的文件。经研究,收藏夹中删除的记录会放到name为.Trash对应的目录中去,如果用户没有对应的.Trash数据库记录,则删除文档的时候会报错,当时删除的时候把代表回收站的数据都删除了,所以用户无法删除收藏夹恢复方法为找到所有缺失的.Trash记录,重新插入数据库即可

SQL如下

代码语言:javascript
复制
insert into desktop_document2 (name,description,uuid,type,data,extra,last_modified,version,is_history,owner_id,parent_directory_id,search,is_trashed,is_managed)
select ".Trash","",uuid(),"directory","{}","","2020-09-20 10:10:10","1",0,owner_id,parent_directory_id,null,false,false
from
(
select id as parent_directory_id,owner_id from desktop_document2 where parent_directory_id is null
  and owner_id not in (selet owner_id from desktop_document2 where name=".Trash")
) a

导出用户的收藏夹

前文已经说明hue将所有用户的收藏夹都放在desktop_document2表中,可以用以下方式导出用户的收藏夹

首先用

代码语言:javascript
复制
select * from auth_user where username="xxx";

找到用户名对应的ID,然后desktopdocument2表中所有ownerid等于改用户ID,并且ishistory是false的记录即为用户的收藏夹,用户的SQL在desktopdocument2表的data和search字段中都有保存,经试验发现search字段中的SQL保存不全,因此需要解析data字段得到用户收藏的SQL,参考SQL如下,由于用到了JSON解析函数,需要高版本的MYSQL才支持。

代码语言:javascript
复制
select name,description,type, REPLACE(
REPLACE(
  JSON_EXTRACT(JSON_EXTRACT(data, '$.snippets'),'$[0].statement'),'\\r\\n', char(10)
), '\\n', char(10)
) as statement
from desktop_document2 where owner_id="xxx" and is_history=false
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-12-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Hadoop实操 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档