【问题标题】:Hive UDF for selecting all except some columnsHive UDF 用于选择除某些列之外的所有列
【发布时间】: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 不能接受其中包含非标准字符的列,例如 $foox/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


【解决方案1】:

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

如果配置属性 hive.support.quoted.identifiers 设置为 none,则 SELECT 语句可以在 Hive 0.13.0 之前的版本或 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 除外。您也可以选择创建视图。

【讨论】:

  • 您说得很好,但您描述的行为并不通用,因为它不允许列中包含非标准字符,这就是为什么在 0.13.0 及更高版本中默认禁用它的原因。我已更新问题以澄清我寻求不依赖此设置的行为。
  • 一个建议:在我工作运行的Hive sql版本中,我们必须在hive.support.quoted.identifiers=none; 前面加上关键字set
猜你喜欢
  • 1970-01-01
  • 2016-03-07
  • 2018-12-16
  • 2019-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-01
  • 2018-11-23
相关资源
最近更新 更多