如何创建一个接受一个字符串并返回多个字符串的UDF?到目前为止,我看到的UDF只能给出一个输出。如何从UDF中获得多个feild作为输出?
最简单的是名称的实现->姓,姓。不是寻找拆分名称的替代解决方案,而是寻找有助于实现这些需求的API/UDF。
让我们说名称拆分器我的UDF
从myTable中选择age,nameSplitter(name(作为firstName,LastName;
输入
****Input****
------------------------
Age | Name
------------------------
24 | John Smit
13 | Sheldon Cooper
-------------------------
OutPut
****Out put ****
-----------------------------------
Age | First Name | Last Name
-----------------------------------
24 | John | Smit
13 | Sheldon | Cooper
-----------------------------------
使用split((函数,它围绕regexp模式拆分字符串并返回一个数组:
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;
模式CCD_ 2表示一个或多个空间。
此外,如果您有三个单词的名称,甚至更长,并且您只想将第一个单词作为名称,将其他所有单词作为姓氏,或者使用更复杂的规则,您可以使用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)
这里的模式表示:字符串"^"的开头,由任意数量的字符组成的第一个捕获组(.*?)
,由任意数目的空格组成的非捕获组(?: +)
,由任意数目的字符组成的最后一个捕获组贪婪(.*)
,$
表示字符串的结尾