hive函数来检索特定的数组元素

bgtovc5b  于 2021-06-01  发布在  Hadoop
关注(0)|答案(1)|浏览(479)

我有一个以数组形式存储字符串的表。我不明白为什么,但简单的例子是这样的:

+--------+----------------------------------+
| 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                               |
+--------+----------------------------------+

我们在上表中看不到,但第一个字符串的真正格式是这样的

基本上,我想检索的是:

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

-始终保持不变,但defgh可以是任何字符串。问题是我不能使用表path.path.path\u path[4],因为字符串-defgh可能是第4个或数组的任何元素(甚至是第20个)。
试图使用 where lower(path.path.string) like (' - %') 但收到错误

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

kknvjkwl1#

这个正则表达式将为您完成这项工作 ([^\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), "$", " ")

更多关于
regexp\u replace&regexp\u extract():https://cwiki.apache.org/confluence/display/hive/languagemanual+udf#languagemanualudf-字符串函数

相关问题