HiveQL(以及一般的 SQL)中常见的查询构建模式是选择所有列(SELECT *
)或明确指定的一组列(SELECT A, B, C
)。 SQL 没有内置机制来选择除指定的一组列之外的所有列。
有多种机制可以排除某些列,如中所述这个问题 https://stackoverflow.com/questions/729197/sql-exclude-a-column-using-select-except-columna-from-tablea但没有一个自然适用于 HiveQL。 (例如,创建临时表的想法SELECT *
then ALTER TABLE DROP
它的一些专栏会在大数据环境中造成严重破坏。)
忽略关于选择除某些列之外的所有列是否是个好主意的意识形态讨论,这个问题是关于扩展 Hive 的这种功能的可能方法。
在 Hive 0.13.0 之前,SELECT 可以采用基于正则表达式的列,例如,property_.*
在反引号引用的字符串内。 @invoketheshell 下面的答案引用了此功能,但它是有代价的,即当此功能启用时,Hive 无法接受其中包含非标准字符的列,例如,$foo
or x/y
。这就是 Hive 开发人员在 0.13.0 中默认关闭此行为的原因。我正在寻找适用于任何列名称的通用解决方案。
通用表生成 UDF (UDTF https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF#LanguageManualUDF-CreatingCustomUDFs)当然可以做到这一点,因为它可以操纵模式 https://stackoverflow.com/questions/25982163/create-multiple-columns-from-single-hive-udf。由于我们不会生成新行,有没有办法使用简单的基于行的 UDF 来解决这个问题?
这似乎是一个常见问题,网上有很多帖子展示了如何针对各种数据库解决这个问题,但我还没有找到 Hive 的解决方案。有没有代码可以做到这一点?
您可以选择除基于正则表达式的规范中列出的列之外的每一列。这是通过排除查询列。见下文:
在 0.13.0 之前的 Hive 版本中,或者在 0.13.0 及更高版本中(如果配置属性 hive.support.quoted.identifiers 设置为 none),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 的列之外的所有列。您也可以选择创建视图。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)