hive udf返回多列输出

7fhtutme  于 2021-06-27  发布在  Hive
关注(0)|答案(1)|浏览(1040)

如何创建一个接受一个字符串并返回多个字符串的自定义项?到目前为止,我看到的udf只能给出一个输出。如何将多个feild作为udf的输出?
最简单的是name->firstname,lastname的实现。不是寻找分割名称的替代解决方案,而是寻找有助于实现此类需求的api/udf。
假设namesplitter是我的自定义项
从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
-----------------------------------
rjzwgtxy

rjzwgtxy1#

使用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; 图案 ' +' 表示一个或多个空格。
另外,如果您有三个单词或更长的名称,并且只想将第一个单词作为名称拆分,而将其他所有单词作为姓氏拆分,或者使用更复杂的规则,则可以使用regexp\u 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)

这里的模式是指:字符串“^”的开头,第一个捕获组由任意数量的字符组成 (.*?) ,由任意数量的空间组成的非捕获组 (?: +) ,最后一个捕获组,由任意数量的字符组成 (.*) ,和 $ 表示字符串的结尾

相关问题