HiveQL(以及一般的 SQL)中的常见查询构建模式是选择所有列 ( SELECT *
) 或显式指定的一组列 ( SELECT A, B, C
)。除了一组指定的列之外,SQL 没有用于选择所有列的内置机制。
有多种机制可以排除某些列,如 this SO question 中所述。但没有一个自然适用于 HiveQL。 (例如,使用 SELECT *
然后 ALTER TABLE DROP
创建一个临时表的想法会在大数据环境中造成严重破坏。)
忽略关于选择除某些列之外的所有列是否是一个好主意的意识形态讨论,这个问题是关于使用此功能扩展 Hive 的可能方法。
在 Hive 0.13.0 之前 SELECT 可以采用基于正则表达式的列,例如,property_.*
反引号内的字符串。下面@invoketheshell 的回答是指此功能,但它是有代价的,也就是说,当此功能开启时,Hive 无法接受其中包含非标准字符的列,例如 $foo
或 x/y
.这就是 Hive 开发人员在 0.13.0 中默认关闭此行为的原因。我正在寻找适用于任何列名称的通用解决方案。
一个通用的表生成 UDF( UDTF )当然可以做到这一点,因为它可以 manipulate the schema .由于我们不打算生成新行,有没有办法使用简单的基于行的 UDF 来解决这个问题?
这似乎是网络上许多帖子的常见问题,展示了如何为各种数据库解决这个问题,但我还没有找到 Hive 的解决方案。是否有代码可以做到这一点?
最佳答案
您可以选择除基于正则表达式的规范中列出的列之外的每一列。这是通过排除查询列。见下文:
如果配置属性 hive.support.quoted.identifiers 设置为 none,则 SELECT 语句可以在 0.13.0 之前的 Hive 版本或 0.13.0 及更高版本中采用基于正则表达式的列规范。
话虽如此,您可以使用以下内容创建新表或 View ,并且将返回除指定列之外的所有列:
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 的列。您也可以选择创建 View 。
关于apache-spark - Hive UDF 用于选择除某些列之外的所有列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31666905/