HiveQL(以及一般的 SQL)中的常见查询构建模式是选择所有列 ( SELECT *
) 或显式指定的一组列 ( SELECT A, B, C
)。SQL 没有用于选择除指定列集之外的所有列的内置机制。
有多种机制可以排除此 SO 问题中概述的某些列,但没有一个自然适用于 HiveQL。(例如,用其中的一些列创建一个临时表的想法SELECT *
会ALTER TABLE DROP
在大数据环境中造成严重破坏。)
忽略关于选择除某些列之外的所有列是否是一个好主意的意识形态讨论,这个问题是关于使用此功能扩展 Hive 的可能方法。
在 Hive 0.13.0 之前,SELECT 可以采用基于正则表达式的列,例如,property_.*
在反引号字符串中。@invoketheshell 下面的回答提到了这个功能,但它是有代价的,也就是说,当这个功能打开时,Hive 不能接受其中包含非标准字符的列,例如,$foo
或x/y
。这就是 Hive 开发人员在 0.13.0 中默认关闭此行为的原因。我正在寻找适用于任何列名的通用解决方案。
生成表的通用 UDF ( UDTF ) 当然可以这样做,因为它可以操作模式。由于我们不打算生成新行,有没有办法使用简单的基于行的 UDF 来解决这个问题?
这似乎是一个常见的问题,网络上的许多帖子展示了如何为各种数据库解决它,但我还没有找到 Hive 的解决方案。有没有代码可以做到这一点?