【问题标题】:Hive UDF to return multiple colunm outputHive UDF 返回多列输出
【发布时间】: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
-----------------------------------

【问题讨论】:

    标签: hive hiveql hive-udf


    【解决方案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 并询问有关实施的问题。
    猜你喜欢
    • 1970-01-01
    • 2014-11-19
    • 1970-01-01
    • 2017-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-17
    • 1970-01-01
    相关资源
    最近更新 更多