【发布时间】:2015-10-18 10:53:43
【问题描述】:
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 的解决方案。有没有代码可以做到这一点?
【问题讨论】:
-
这个未解决的错误可能会导致问题,因为这意味着您无法执行 UDF,例如all_except(*, exclude_column1, exclude_column2) issues.apache.org/jira/browse/HIVE-1459
-
谢谢@mattinbits。我为这个问题投了票,并鼓励其他人也这样做。
标签: apache-spark hive hiveql apache-spark-sql udf