如何合并Hive与Metastore查询获取列名及极值?Hive是否有information_schema?
嘿,这俩问题我都门儿清,给你唠唠:
一、能不能把两个查询合并?
直接用静态SQL没法一步到位哈,因为元数据查询拿到的是列名,而极值查询需要把这些列名作为动态字段来计算min/max——Hive的静态SQL不支持这种动态列的写法。不过咱可以用动态SQL+脚本的方式来实现合并效果,步骤大概是这样:
- 先通过元数据查询拿到目标表的所有列名(注意你原来的SQL用了
PARTITION_KEYS,这只能拿到分区列,如果要查普通列得换成COLUMNS_V2表); - 把拿到的列名拼接成包含
min()、max()的查询语句; - 执行这个动态生成的SQL。
给你整个shell脚本的例子参考:
# 第一步:从元数据获取people表的所有普通列名(如果是分区列就换回PARTITION_KEYS) cols=$(hive -e "SELECT c.COLUMN_NAME FROM TBLS t JOIN DBS d ON t.DB_ID = d.DB_ID JOIN COLUMNS_V2 c ON t.TBL_ID = c.CD_ID WHERE t.TBL_NAME='people' ORDER BY c.INTEGER_IDX") # 第二步:拼接动态查询语句 sql_prefix="SELECT " for col in $cols; do sql_prefix+="\`$col\`, MIN(\`$col\`) AS min_\`$col\`, MAX(\`$col\`) AS max_\`$col\`, " done # 去掉末尾多余的逗号 final_sql=${sql_prefix%, }" FROM people" # 第三步:执行最终SQL hive -e "$final_sql"
如果是在Hive CLI里想直接搞,也可以用Hive的reflect函数结合collect_set,不过这种写法比较绕,不如脚本直观。
二、Hive有没有类似information_schema的表?
必须有!从Hive 0.13版本开始就支持标准的information_schema了,它是符合SQL标准的元数据查询方式,比直接查TBLS、COLUMNS_V2这些原生元数据表要友好得多。
常用的查询例子:
- 查询people表的列信息(包含列名、类型、注释等):
SELECT column_name, data_type, column_comment FROM information_schema.columns WHERE table_name = 'people' AND table_schema = 'your_database_name'; -- 别忘了指定库名,不然会查所有库
- 查询数据库下的所有表:
SELECT table_name, table_type FROM information_schema.tables WHERE table_schema = 'your_database_name';
要是你用的Hive版本比较老(低于0.13),那只能用你原来用的那些原生元数据表(TBLS、DBS、COLUMNS_V2、PARTITION_KEYS等),不过现在大部分生产环境的Hive版本都支持information_schema啦。
内容的提问来源于stack exchange,提问作者rogue
相关产品推荐
相关产品推荐

