Функция Hive для получения определенного элемента массива - PullRequest
0 голосов
/ 25 октября 2018

У меня есть таблица, в которой хранятся строки в массиве.Не могу понять, почему, но простой пример выглядит так:

+--------+----------------------------------+
| reason |              string              |
+--------+----------------------------------+
| \N     | \N\N\N\NXXX - ABCDEFGH\N\N |
| \N     | \N\N\N\NXXX - ABCDEFGH       |
| \N     | \N\N\N\N                      |
| \N     | \N\N\N\NXXX - ABCDEFGH\N    |
| \N     | \N\N                            |
| \N     | \N\N\N                         |
| \N     | \N                               |
+--------+----------------------------------+

Мы не могли видеть это в таблице выше, но истинный формат первой строки выглядит так enter image description here

По сути, я хотел бы получить следующее:

+--------+----------------------------------+
| reason |              string              |
+--------+----------------------------------+
| \N     |          XXX - ABCDEFGH          |
+--------+----------------------------------+

XXX - всегда остается тем же, но ABCDEFGH может быть любой строкой.Проблема в том, что я не могу использовать таблицу path.path.path_path [4], потому что строка XXX - ABCDEFGH может быть 4-й или любой элемент массива (даже 20-й).

Пытался использовать where lower(path.path.string) like ('xxx - %'), но получилошибка

Select 
path.path.reason, 
path.path.string
From table_name
Where path.id = '123'
And datestr = '2018-07-21'

1 Ответ

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

Это регулярное выражение сделает всю работу за вас ([^\N$])+.

Предполагая, что символ, показанный на изображении, является $.

Сначала , вы можете использовать regexp_extract() для извлечения определенного элемента массива.Он имеет следующий синтаксис:

regexp_extract(string subject, string pattern, int index)

Второй , вы можете использовать regexp_replace, который имеет следующий синтаксис:

regexp_replace(string INITIAL_STRING, string PATTERN, string REPLACEMENT)

Тестовые данные

WITH string_column 
     AS (SELECT explode(array('XXX - ABCSSSSSSSSSSSGH\N\N', 
                    '\N$\N$\N$\N$XXX - ABCDEFGH$\N\N', 
                    '\N\N\N\N', '\N\N\N\NXXX - ABCDEFGH\N')) AS 
            str_column
        ) 
SELECT regexp_replace(regexp_extract(str_column, '([^\N$])+', 0), "$", " ") 
    AS string_col 
FROM string_column 

Результатом будет

------------------------------
|         string_col         |
------------------------------
| XXX - ABCSSSSSSSSSSSGH     |
------------------------------
| XXX - ABCDEFGH             |
------------------------------
|                            |
------------------------------
| XXX - ABCDEFGH             |
------------------------------

Примечание: '0', который указывает индекс, производит совпадение после извлечения на основе шаблона.

regexp_extract(str_column, '(,|[^\N$])+', 0) 

Следующееоператор заменяет вхождение любого '$'

regexp_replace(regexp_extract(str_column, '([^\N$])+', 0), "$", " ")

. Для получения дополнительной информации о

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...