Hive UDF 返回多列输出
Posted
技术标签:
【中文标题】Hive UDF 返回多列输出【英文标题】:Hive UDF to return multiple colunm output 【发布时间】:2018-10-30 22:13:54 【问题描述】:如何创建一个 UDF,它接受一个字符串返回多个字符串? 到目前为止我看到的 UDF 只能给出一个输出。如何从 UDF 中获取多个字段作为输出?
最简单的方法是实现 name -> FirstName, LastName。 不是寻找拆分名称的替代解决方案,而是寻找有助于实现此类需求的 API / UDF。
让我们说 nameSplitteris 我的 UDF
从 myTable 中选择 age,nameSplitter(name) 作为 firstName,LastName;
输入
****Input****
------------------------
Age | Name
------------------------
24 | John Smit
13 | Sheldon Cooper
-------------------------
输出
****Out put ****
-----------------------------------
Age | First Name | Last Name
-----------------------------------
24 | John | Smit
13 | Sheldon | Cooper
-----------------------------------
【问题讨论】:
【参考方案1】:使用split()函数,它围绕正则表达式模式拆分字符串并返回一个数组:
select age,
NameSplitted[0] as FirstName,
NameSplitted[1] as LastName
from
(
select age,
split(Name,' +') as NameSplitted
from myTable
)s;
或者只是select age, split(Name,' +')[0] FirstName, split(Name,' +')[0] LastName from myTable;
模式' +'
表示一个或多个空格。
此外,如果您有三个单词名称甚至更长,并且您只想将第一个单词拆分为名称,而将其他所有单词拆分为姓氏,或者使用更复杂的规则,您可以使用 regexp_extract 函数,如下例所示:
hive> select regexp_extract('Johannes Chrysostomus Wolfgangus Theophilus Mozart', '^(.*?)(?: +)(.*)$', 1);
OK
Johannes
Time taken: 1.144 seconds, Fetched: 1 row(s)
hive> select regexp_extract('Johannes Chrysostomus Wolfgangus Theophilus Mozart', '^(.*?)(?: +)(.*)$', 2);
OK
Chrysostomus Wolfgangus Theophilus Mozart
Time taken: 0.692 seconds, Fetched: 1 row(s)
这里的模式表示:字符串'^'的开头,第一个捕获组由任意数量的字符组成(.*?)
,非捕获组由任意数量的空格组成(?: +)
,最后一个捕获组由任意数量组成字符贪婪(.*)
,$
表示字符串的结尾
【讨论】:
先生,如何拥有一个返回两个字段的 UDF 是问题,而不是替代方法。 @user2458922 抱歉,我误会了你。也许这段代码会有用,您可以开始实现自己的 UDF:github.com/apache/hive/blob/master/ql/src/java/org/apache/… - 这是 split() UDF 代码,您可以修改代码并构建自己的 UDF。尝试实施您自己的 UDF 并询问有关实施的问题。以上是关于Hive UDF 返回多列输出的主要内容,如果未能解决你的问题,请参考以下文章
Pyspark udf 在接受多列作为输入的条件定义上返回一列