创建一个使用可以返回列名的 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 查询的主要内容,如果未能解决你的问题,请参考以下文章