如何在 Hive 的所有表中找到特定的列名。?
Posted
技术标签:
【中文标题】如何在 Hive 的所有表中找到特定的列名。?【英文标题】:How can I find a particular column name within all tables in Hive.? 【发布时间】:2018-01-18 12:46:32 【问题描述】:如何在 Hive 的所有表中找到特定的列名?
我在 hive 中运行了这个查询:select table_name,column_name from retail.columns where column_name like '%emp%';
(retail 是一个数据库)。
但它正在给予:
error FAILED: SemanticException Line 0:-1 Table not found 'columns'
我试过查询:select distinct table_name from default.columns where column_name = 'emp'
(默认是我的数据库)。但它也给出了错误。
我搜索了这些,得到了我为 SQL 数据库编写的查询。
但我想在 hive 数据库中搜索?如何进入蜂巢?
之前有人问过同样的问题,但我觉得事情可能已经改变,可能有直接的解决方案:
How can you search for all tables with a given column name and return which tables have this column name in Hadoop/Hive?
Searching Tables and Columns in Hive
【问题讨论】:
“我为 SQL 数据库编写的查询” >> 你真的相信有通用 SQL 数据库的概念吗?!?在访问元数据时,每个 DBMS 都有自己的方式——一些支持INFORMATION_SCHEMA
,一些支持sys
,一些支持SYSTEM
——而Hive 支持nothing。至少从 SQL 提示符开始。您必须使用 Metastore 服务及其(未记录的)Java API。或者可能是 Metastore 数据库(存储在 Derby 或 mysql 或 Postgres 或其他),除了模式也没有记录。
@SamsonScharfrichter Metastore 的 ER 图在 wiki 上。 cwiki.apache.org/confluence/display/Hive/…PDF:issues.apache.org/jira/secure/attachment/12471108/…
【参考方案1】:
下面的 shell 脚本会给你想要的结果:
hive -S -e 'show databases'|
while read database
do
eval "hive -S -e 'show tables in $database'"|
while read line
do
if eval "hive -S -e 'describe $database.$line'"| grep -q "<column_name"; then
output="Required table name: $database.$line"'\n';
else
output=""'\n';
fi
echo -e "$output"
done
done
【讨论】:
如果我们已经知道数据库名称,它就可以正常工作。但是如果我们不知道数据库名,那我们怎么才能找到表名呢?还有一个问题是上面的查询工作很慢。如果我们将在大型数据库中执行此脚本,将花费大量时间。我们可以提高性能吗..? @mohit.kc 我已调整脚本以扫描 hive 中存在的所有数据库并进一步扫描该数据库中存在的所有表。也做了一些修改来满足性能提升。希望这个脚本能满足您的需要 欢迎莫希特 :) 嗨@AbhishekAnand,希望你做得很好。如果我将第一行更改为 hive -S -e 'show databases like 'abc_xyz%'',代码不会进入循环你能帮忙解决这个问题吗?原因:实际数据库数量超过 2000 个,如果我按显示数据库(如 'abc_xyz%')进行过滤,它将只有 50 个数据库。请让我知道有没有办法在上面的 shell 中实现它?【参考方案2】:如果你知道你的专栏的名字,我相信这个查询会对你有所帮助:
select table_name,column_name from information_schema.columns
where column_name like '%lead%'
【讨论】:
【参考方案3】:我在下面编写了这个简化的 shell 脚本来得到结果:
第1步:替换下面脚本中的
while read line
do
if eval "hive -S -e 'describe <DB_NAME>.$line'"| grep -q "<COLUMN_NAME>"; then
output="$output <DB_NAME>.$line"'\n';
fi
done < <(eval "hive -S -e 'show tables in <DB_NAME>'")
第 2 步:运行以下命令
echo -e "Required table name:\n\n $output"
注意:记得清除变量输出,以防多次运行。
output=""
【讨论】:
【参考方案4】:这是您可以在元存储上使用的查询:
select TBL_NAME, COLUMN_NAME, TYPE_NAME from TBLS left join COLUMNS_V2 on CD_ID = TBL_ID where COLUMN_NAME like 'column';
其中 'column' 是您要查找的列名。
【讨论】:
列显然没有通过 CD_ID 链接到表,它与 TBL_ID 不匹配。鉴于名称,我没想到会...以上是关于如何在 Hive 的所有表中找到特定的列名。?的主要内容,如果未能解决你的问题,请参考以下文章
如何从 SQL Server 中特定数据库的表中获取所有列名?