1

如何创建一个接受 String 返回多个 Strings 的 UDF?到目前为止我看到的 UDF 只能给出一个输出。如何从 UDF 获取多个字段作为输出?

最简单的实现是 name -> FirstName, LastName。不是寻找拆分名称的替代解决方案,而是寻找有助于实现此类需求的 API / UDF。

让我们说名称Splitteris my 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
-----------------------------------
4

1 回答 1

0

使用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)

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

于 2018-10-31T05:50:49.617 回答