hive meta 元数据在mysql 中查不到列信息

278 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

背景

hive 使用mysql作为元数据库,在hive中show create table 能够看到表结构,查询mysql,能查到表,却查不到列信息

在hive中查询

在这里插入图片描述

在mysql中查询

SQL:SELECT c.* FROM columns_v2 c,tbls t,dbs d WHERE c.CD_ID = t.TBL_ID AND t.DB_ID = d.DB_ID AND UPPER(d.NAME) = 'STGB_BILLDETAIL' AND UPPER(t.TBL_NAME) = 'MOBILE_CALL_EVENT' 在这里插入图片描述 可见不一致

解决:使用这个SQL

SQL:SELECT DBS.NAME AS TABLE_SCHEMA, TBLS.TBL_NAME AS TABLE_NAME, TBL_COMMENTS.TBL_COMMENT AS TABLE_DESCRIPTION, COLUMNS_V2.COLUMN_NAME AS COLUMN_NAME, COLUMNS_V2.TYPE_NAME AS COLUMN_DATA_TYPE_DETAILS FROM DBS JOIN TBLS ON DBS.DB_ID = TBLS.DB_ID JOIN SDS ON TBLS.SD_ID = SDS.SD_ID JOIN COLUMNS_V2 ON COLUMNS_V2.CD_ID = SDS.CD_ID JOIN ( SELECT DISTINCT TBL_ID, TBL_COMMENT FROM ( SELECT TBLS.TBL_ID TBL_ID, TABLE_PARAMS.PARAM_KEY, TABLE_PARAMS.PARAM_VALUE, CASE WHEN TABLE_PARAMS.PARAM_KEY = 'comment' THEN TABLE_PARAMS.PARAM_VALUE ELSE '' END TBL_COMMENT FROM TBLS JOIN TABLE_PARAMS ON TBLS.TBL_ID = TABLE_PARAMS.TBL_ID ) TBL_COMMENTS_INTERNAL ) TBL_COMMENTS ON TBLS.TBL_ID = TBL_COMMENTS.TBL_ID where UPPER(tbls.TBL_NAME) = 'JZYTEST' and UPPER(DBS.NAME) = 'STGB_BILLDETAIL' 在这里插入图片描述 可以看到已经可以查出来了

原因分析

现象

后来我建了一个jzytest表使用create table STGB_BILLDETAIL.JZYTEST as STGB_BILLDETAIL.MOBILE_SMS_EVENT 命令建表 在mysql中第一种sql查询不到meta信息,第二种就可以。

分析

使用 create table xxx as select * from xxx 创建的表信息,在mysql中是有关联的,所以使用第一种sql是查不到

解决思路

1.开始怀疑是有的库可以,有的库不可以,结果发现不是这样的 2.发现是使用create table xxx as select * from xxx 建的表不能是有第一种sql,查出来怀疑,内部有什么关联。 3.修改SQL解决问题。

两种sql区别

一个是普通的联接,结果中的记录在两个表中都有。 一个是外联接,join的表只是作辅助数据。以左外连接为例 ,结果中的记录在A表中存在,B表中不一定有。相当于a表为主体表,b为辅助表。 例子:

mysql> select * from a; +------+------+ | id | col | +------+------+ | 1 | 11 | | 2 | 12 | | 3 | 13 | +------+------+ 3 rows in set (0.00 sec)

mysql> select * from b; +------+------+ | id | col | +------+------+ | 2 | 22 | | 3 | 23 | | 5 | 25 | +------+------+ 3 rows in set (0.00 sec)

mysql> mysql> select * from a,b where a.id=b.id; +------+------+------+------+ | id | col | id1 | col1 | +------+------+------+------+ | 2 | 12 | 2 | 22 | | 3 | 13 | 3 | 23 | +------+------+------+------+ 2 rows in set (0.08 sec)

mysql> select * from a left join b on a.id=b.id; +------+------+------+------+ | id | col | id1 | col1 | +------+------+------+------+ | 1 | 11 | NULL | NULL | | 2 | 12 | 2 | 22 | | 3 | 13 | 3 | 23 | +------+------+------+------+ 3 rows in set (0.00 sec)