配置单元UDF返回多个colunm输出

时间:2018-10-30 22:13:55

标签: hive hiveql hive-udf

如何创建使用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
-----------------------------------

1 个答案:

答案 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)

这里的模式表示:字符串'^'的开头,第一个捕获组由任意数量的字符(.*?)组成,非捕获组由任意数量的空格(?: +)组成,最后一个捕获组由任意数量的字符贪婪(.*)组成,而$表示字符串的结尾