如何创建使用String返回多个String的UDF? 到目前为止,我所看到的UDF只能给出一个输出。如何从UDF获得多个字段作为输出?
最简单的是名称-> FirstName,LastName的实现。 不是在寻找用于拆分名称的替代解决方案,而是在寻找有助于实现此类需求的API / UDF。
我们说nameSplitter是我的UDF
从myTable中选择age,nameSplitter(name)作为firstName,LastName;
InPut
****Input****
------------------------
Age | Name
------------------------
24 | John Smit
13 | Sheldon Cooper
-------------------------
OutPut
****Out put ****
-----------------------------------
Age | First Name | Last Name
-----------------------------------
24 | John | Smit
13 | Sheldon | Cooper
-----------------------------------
答案 0 :(得分:0)
使用split()函数,它会在正则表达式模式周围拆分strinng并返回一个数组:
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)
这里的模式表示:字符串'^'的开头,第一个捕获组由任意数量的字符(.*?)
组成,非捕获组由任意数量的空格(?: +)
组成,最后一个捕获组由任意数量的字符贪婪(.*)
组成,而$
表示字符串的结尾