选择除某些列外的所有列的Hive UDF

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的解决方案。是否有某个地方有可用的代码?

1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - mattinbits
感谢 @mattinbits。我已经投票支持这个问题,并鼓励其他人也这样做。 - Sim
1个回答

9

除了基于正则表达式的规范中列出的列,您可以选择每一列。这是通过排除查询列来实现的。请参见下面:

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

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

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


你说得很有道理,但是你描述的行为并不通用,因为它禁止包含非标准字符的列,在0.13.0及更高版本中默认禁用。我已经更新了问题以澄清我寻求的行为不依赖于此设置。 - Sim
一个建议:在我工作中运行的Hive sql版本中,我们必须在“hive.support.quoted.identifiers=none;”前面添加关键字“set”。 - RobertF

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接