11

HiveQL(以及一般的 SQL)中的常见查询构建模式是选择所有列 ( SELECT *) 或显式指定的一组列 ( SELECT A, B, C)。SQL 没有用于选择除指定列集之外的所有列的内置机制。

有多种机制可以排除此 SO 问题中概述的某些列,但没有一个自然适用于 HiveQL。(例如,用其中的一些列创建一个临时表的想法SELECT *ALTER TABLE DROP在大数据环境中造成严重破坏。)

忽略关于选择除某些列之外的所有列是否是一个好主意的意识形态讨论,这个问题是关于使用此功能扩展 Hive 的可能方法。

在 Hive 0.13.0 之前,SELECT 可以采用基于正则表达式的列,例如,property_.*在反引号字符串中。@invoketheshell 下面的回答提到了这个功能,但它是有代价的,也就是说,当这个功能打开时,Hive 不能接受其中包含非标准字符的列,例如,$foox/y。这就是 Hive 开发人员在 0.13.0 中默认关闭此行为的原因。我正在寻找适用于任何列名的通用解决方案。

生成表的通用 UDF ( UDTF ) 当然可以这样做,因为它可以操作模式。由于我们不打算生成新行,有没有办法使用简单的基于行的 UDF 来解决这个问题?

这似乎是一个常见的问题,网络上的许多帖子展示了如何为各种数据库解决它,但我还没有找到 Hive 的解决方案。有没有代码可以做到这一点?

4

1 回答 1

9

您可以选择除基于正则表达式的规范中列出的列之外的每一列。这是排除的查询列。见下文:

如果配置属性 hive.support.quoted.identifiers 设置为 none,则 SELECT 语句可以在 0.13.0 之前的 Hive 版本或 0.13.0 及更高版本中采用基于正则表达式的列规范。

话虽如此,您可以使用以下命令创建一个新表或视图,并且将返回除指定列之外的所有列:

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。您也可以选择创建视图。

于 2015-07-28T11:34:27.960 回答