HiveQL(以及一般的SQL)中常见的查询构建模式是要么选择所有列(SELECT *
),要么选择显式指定的列集(SELECT A, B, C
)。SQL没有内置机制来选择除指定列集之外的所有列。
有多种机制可以排除这个问题中概述的某些列,但没有一种机制自然适用于HiveQL。(例如,用SELECT *
和ALTER TABLE DROP
创建一个临时表的想法,其中的一些列会在大数据环境中造成严重破坏。)
忽略关于选择除部分列外的所有列是否是个好主意的思想讨论,这个问题是关于用这种能力扩展Hive的可能方法。
在Hive 0.13.0之前,SELECT可以接受基于正则表达式的列,例如,property_.*
在一个带反引号的字符串中。@ invokeshell下面的回答提到了这个功能,但它是有代价的,那就是,当这个功能开启时,Hive不能接受包含非标准字符的列,例如$foo
或x/y
。这就是Hive开发者在0.13.0中默认关闭此行为的原因。我正在寻找一个通用的解决方案,适用于任何列名。
通用表生成UDF (UDTF)当然可以做到这一点,因为它可以操作模式。既然我们不打算生成新行,那么是否有一种方法可以使用简单的基于行的UDF来解决这个问题?
这似乎是一个常见的问题,许多帖子在网上展示了如何解决它的各种数据库,但我还没有能够找到一个解决方案的Hive。有没有什么地方有这样的代码?
您可以选择除基于regex的规范中列出的列之外的所有列。这是按排除列查询。见下文:
在0.13.0之前的Hive版本中,SELECT语句可以使用基于正则表达式的列规范,如果配置属性Hive .support. quotes .identifiers设置为none,则在0.13.0及以后的版本中,SELECT语句可以使用基于正则表达式的列规范。
也就是说,您可以使用以下命令创建一个新的表或视图,并且除了指定的列之外的所有列都将返回:
hive.support.quoted.identifiers=none;
drop table if exists database.table_name;
create table if not exists database.table_name as
select `(column_to_remove_1|...|column_to_remove_N)?+.+`
from database.some_table
where
--...
;
这将创建一个表,其中包含some_table中的所有列,除了名为column_to_remove_1,…,改为column_to_remove_N。您也可以选择创建一个视图。