本文已参与「新人创作礼」活动,一起开启掘金创作之路。
背景
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)