创建一个使用可以返回列名的 UDF 函数的 hiveQL 查询

Posted

技术标签:

【中文标题】创建一个使用可以返回列名的 UDF 函数的 hiveQL 查询【英文标题】:creating a hiveQL query that uses UDF function that can return column names 【发布时间】:2012-09-19 23:21:18 【问题描述】:

我想创建一个 Hive UDF 函数,该函数根据某个值返回特定的列名,例如 retreivecol(age)。如果年龄为 20 岁,则返回要在选择查询中使用的列名列表,例如 'name,email, fbuserid,friend list ' 等,如果年龄小于 20 则单独返回 'name'。所以我希望我的 HIVE QL 查询看起来像

从 User_Data 中选择 retreivecol(age);

上述查询仅打印列的名称,例如“姓名、电子邮件、fbuserid、朋友列表”等,而不是将它们视为列名并基于相同的过滤器进行过滤。感谢任何指针。

【问题讨论】:

【参考方案1】:

我不确定 UDF 是否适合执行此操作,因为 UDF 只是查看传递给它们的值,它们实际上无法访问整个表结构。

相反,您可以在嵌套表中执行此操作吗?

select name,email,id FROM
(
  select
    name,
    if(age < 20, email, NULL) as email,
    if(age < 20, id, NULL) as id
  FROM mytable

) a

【讨论】:

感谢您的回答,但我正在查看多个条件,基本上我必须根据 UDF 函数动态确定我必须包含在 select 语句中的字段。类似 funct(xqy)== 123 然后返回姓名、电子邮件、年龄 else if funct (xqy)==234 返回年龄、电子邮件等。我有多个相同的条件,我不想在 HiveQL 中编写所有 if 语句 接受所有这些参数的 udf 怎么样,然后像逗号分隔的有效值列表一样返回?例如:getStuff(age,email,id) => "frank"。如果需要,您甚至可以通过第二步将列表拆分为单独的列。

以上是关于创建一个使用可以返回列名的 UDF 函数的 hiveQL 查询的主要内容,如果未能解决你的问题,请参考以下文章

带参数的 getItem 是列名

hive之udf函数的使用

使用列名数组中的 UDF 将列合并到单个映射中

处理 hive udf 中的多行

可以在 SQL 的 UDF 中使用列名吗?

一套 Spark UDF 实践教程(文末专栏抽奖)