Hive UDF 返回多列输出

Posted

技术标签:

【中文标题】Hive UDF 返回多列输出【英文标题】:Hive UDF to return multiple colunm output 【发布时间】:2018-10-30 22:13:54 【问题描述】:

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

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

让我们说 nameSplitteris 我的 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
-----------------------------------

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

先生,如何拥有一个返回两个字段的 UDF 是问题,而不是替代方法。 @user2458922 抱歉,我误会了你。也许这段代码会有用,您可以开始实现自己的 UDF:github.com/apache/hive/blob/master/ql/src/java/org/apache/… - 这是 split() UDF 代码,您可以修改代码并构建自己的 UDF。尝试实施您自己的 UDF 并询问有关实施的问题。

以上是关于Hive UDF 返回多列输出的主要内容,如果未能解决你的问题,请参考以下文章

Pyspark udf 在接受多列作为输入的条件定义上返回一列

hive--udf函数(开发-4种加载方式)

Hive UDF 不返回预期结果

Hive UDTF开发指南

在 HIVE UDF 中返回 ArrayList<String>

自动增量 UDF 在 hive 中工作,但在 Impala 中返回 null