如何在 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 中特定数据库的表中获取所有列名?

如何在不包含新列名和类型的情况下更改现有 Hive 表中的列注释?

如何在 MySQL 中找到所有具有特定列名的表?

如何更改 hive 中的列名

如何使用 Spark SQL 识别 hive 表中的分区列

如何在 Teradata 数据库中查找所有具有特定列名的表?