Как создать UDF, который принимает строку, возвращающую несколько строк? UDF, который я видел до сих пор, может дать только один результат. Как получить несколько файлов на выходе из UDF?
Самым простым будет реализация name -> FirstName, LastName. Не ищу альтернативного решения для разделения имен, но ищу API / UDF, который помог бы реализовать такие потребности.
Давайте скажем имяSplitteris мой UDF
Select age,nameSplitter(name) as firstName,LastName from myTable;
InPut
****Input****
------------------------
Age | Name
------------------------
24 | John Smit
13 | Sheldon Cooper
-------------------------
OutPut
****Out put ****
-----------------------------------
Age | First Name | Last Name
-----------------------------------
24 | John | Smit
13 | Sheldon | Cooper
-----------------------------------
Используйте функцию расколоть(), она разбивает строку вокруг шаблона регулярного выражения и возвращает массив:
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)
Шаблон здесь означает: начало строки '^', первую группу захвата, состоящую из любого количества символов (.*?)
, группу без захвата, состоящую из любого количества пробелов, (?: +)
, последнюю группу захвата, состоящую из любого количества жадных символов (.*)
, и $
означает конец строки
@ user2458922 Извините, я вас не так понял. Возможно, этот код будет полезен, и вы сможете начать реализацию своего собственного UDF: github.com/apache/hive/blob/master/ql/src/java/org/apache/… - это код UDF split (), вы можете изменить код и создать свой собственный UDF. Попробуйте реализовать свой собственный UDF и задайте вопросы о реализации.
Сэр, вопрос, как получить UDF, который возвращает два поля, а не альтернативный способ сделать это.