UDF Hive для возврата вывода нескольких столбцов

Как создать 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
-----------------------------------
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
106
1

Ответы 1

Используйте функцию расколоть(), она разбивает строку вокруг шаблона регулярного выражения и возвращает массив:

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 31.10.2018 16:56

@ user2458922 Извините, я вас не так понял. Возможно, этот код будет полезен, и вы сможете начать реализацию своего собственного UDF: github.com/apache/hive/blob/master/ql/src/java/org/apache/… - это код UDF split (), вы можете изменить код и создать свой собственный UDF. Попробуйте реализовать свой собственный UDF и задайте вопросы о реализации.

leftjoin 31.10.2018 17:18

Другие вопросы по теме