只需从配置单元表中获取列名
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;
【讨论】:
以上是关于只需从配置单元表中获取列名的主要内容,如果未能解决你的问题,请参考以下文章