Hive UDF для возврата нескольких выходных данных - PullRequest
0 голосов
/ 31 октября 2018

Как создать UDF, который принимает строку, возвращающую несколько строк? До сих пор UDF, который я видел, мог дать только один вывод. Как получить несколько полей как вывод из UDF?

Простейшей была бы реализация name -> FirstName, LastName. Не искать альтернативного решения для разделения имен, но ищу API / UDF, который помог бы реализовать такие потребности.

Скажем имя Сплиттерис мой UDF

Выберите возраст, nameSplitter (name) как firstName, LastName из myTable;

1010 * Input *

    ****Input****
------------------------
    Age | Name
------------------------
    24  | John Smit
    13  | Sheldon Cooper
-------------------------

выход

    ****Out put ****
-----------------------------------
    Age | First Name  | Last Name
-----------------------------------
    24  | John        | Smit
    13  | Sheldon     | Cooper
-----------------------------------

1 Ответ

0 голосов
/ 31 октября 2018

Используйте функцию 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)

Образец здесь означает: начало строки '^', первая группа захвата, состоящая из любого числа символов (.*?), группа захвата, состоящая из любого количества пробелов (?: +), последняя группа захвата, состоящая из любого числа символов жадные (.*), а $ означает конец строки

...