只需从配置单元表中获取列名

Posted

技术标签:

【中文标题】只需从配置单元表中获取列名【英文标题】:Just get column names from hive table 【发布时间】:2014-11-28 15:50:23 【问题描述】:

我知道您可以通过 hive 中的以下技巧从表中获取列名:

hive> set hive.cli.print.header=true;
hive> select * from tablename;

是否也可以从表中获取列名?

我不喜欢为我只需要一次的东西更改设置。

我目前的解决方案如下:

hive> set hive.cli.print.header=true;
hive> select * from tablename;
hive> set hive.cli.print.header=false;

这似乎过于冗长且违反 DRY 原则。

【问题讨论】:

您的意思是您需要获取列名以及 select * 输出? 为什么不做一个描述表?? 哇!在文档中没有找到那个。描述表就可以了。 Hive - get column names的可能重复 【参考方案1】:

如果您只是想查看列名,这一行应该提供它而不更改任何设置:

describe database.tablename;

但是,如果这不适用于您的 hive 版本,此代码将提供它,但您的默认数据库现在将是您正在使用的数据库:

use database;
describe tablename;

【讨论】:

我有一个问题:将描述扫描所有​​分区,导致HiveMetastore OOM?我在执行 describe tablename 时遇到了 OOM。 谢谢!,但这也提供了额外的信息,比如关于分区等,如何只过滤列名有什么想法吗? 我如何添加一个值,例如。 '%INVENTORY%' 到上面的代码中检查是否有任何包含库存的列? 只要按照下面的答案,这是更正确的答案。 show columns in $table 我们如何使用 select 语句将所有属性作为 hive 中的列而不是使用 describe 语句【参考方案2】:

您也可以通过 show columns in $table 或查看 Hive, how do I retrieve all the database's tables columns 访问 hive 元数据

【讨论】:

这应该是对“是否有可能获取列名”问题的公认答案,因为describe 提供了额外信息。 这个答案比较合适。因为它不返回额外的信息。例如,如果您的表有分区,DESCRIBE 命令将返回一些额外的行,包括空行。 这个答案需要从 Hive 3.0 开始编辑!现在show columns in $table 对列名进行排序,当顺序很重要时可能会中断其他代码。【参考方案3】:

使用 Hive CLI 或 beeline 中的 desc tablename 获取所有列名。如果您想要文件中的列名,请从 shell 运行以下命令。

$ hive -e 'desc dbname.tablename;' > ~/columnnames.txt

其中dbname 是您的表所在的 Hive 数据库的名称 您可以在根目录中找到文件 columnnames.txt。

$cd ~
$ls

【讨论】:

【参考方案4】:

解决办法是

use show columns in table_name;

这个比

简单
use describe tablename;

非常感谢。

【讨论】:

【参考方案5】:

最好的方法是设置以下属性:

set hive.cli.print.header=true;
set hive.resultset.use.unique.column.names=false;

【讨论】:

以上是关于只需从配置单元表中获取列名的主要内容,如果未能解决你的问题,请参考以下文章

有条件地在其他列上从配置单元表中获取最新列值

从具有多个分区列的配置单元表中获取最新数据

在配置单元中创建表时向列添加默认值

从配置单元表中的 json 字符串中提取值

从 Firebird 数据库表中获取列名列表

如何从配置单元表中的json字符串中提取数组元素?