Hive — использование функции replace или regexp_replace для нескольких условий замены

Я использую Hive и пытаюсь очистить данные, которые могут содержать несколько нежелательных данных. Хотел бы знать, могу ли я использовать одну функцию regexp_replace или translate для нескольких условий.

Например. Если строка 2000 Helen St - DO NOT USE, мне нужно заменить/обрезать - DO NOT USE, а также изменить St на Street. Вывод должен быть 2000 Helen Street.

Сходным образом

  • 3000 Cross St должно быть 3000 Cross Street,
  • 4000 Mascot Dr должно быть 4000 Mascot Drive
  • так далее..

Существует около 10 или более таких условий очистки, и входная строка может соответствовать либо 0, либо нескольким критериям условий. Можно ли настроить эти условия в одном regexp_replace?


person Suraj    schedule 13.03.2018    source источник
comment
Можете ли вы показать несколько примеров условий очистки? также включите вашу попытку до сих пор.   -  person Vamsi Prabhala    schedule 14.03.2018
comment
Мне кажется, что у вас будет набор правил преобразования, и многократное использование regexp_replace не должно быть решением clean. Скорее подумайте о написании простого GenericUDF, который позаботится обо всех сценариях. И он поставляется с мощью Java, поэтому есть бесконечные возможности очистки всех типов данных.   -  person Gyanendra Dwivedi    schedule 14.03.2018


Ответы (1)


Вы можете легко комбинировать шаблоны для удаления подстрок или замены их тем же значением с помощью оператора ИЛИ (|). В других случаях используйте несколько regexp_replace:

Например, если вы хотите удалить «ТЕСТ» и «- НЕ ИСПОЛЬЗОВАТЬ» и заменить «Доктор» на «Улица»:

hive> select regexp_replace(
                  regexp_replace('TEST 2000 Helen St - DO NOT USE',
                                 '[- ]*DO NOT USE|TEST( *|$)',''),
                          'St([ ]*|$)','Street'  
                  );
OK
2000 Helen Street
Time taken: 0.055 seconds, Fetched: 1 row(s)

Он удаляет «ТЕСТ» и «НЕ ИСПОЛЬЗОВАТЬ» — они объединены в один шаблон. «St» заменено на «Street» — это второе regexp_replace. Конечно, это только пример.

person leftjoin    schedule 14.03.2018
comment
я думаю, вы можете просто использовать вложенный replace вместо regexp_replace. - person Vamsi Prabhala; 14.03.2018
comment
@VamsiPrabhala Возможно, это зависит от сложности шаблонов. - person leftjoin; 14.03.2018
comment
это также зависит от того, какую версию Hive вы используете — в более старых версиях не будет replace. - person Z4-tier; 14.08.2020