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

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

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

  1. +--------+----------------------------------+
  2. | reason | string |
  3. +--------+----------------------------------+
  4. | \N | \N\N\N\NXXX - ABCDEFGH\N\N |
  5. | \N | \N\N\N\NXXX - ABCDEFGH |
  6. | \N | \N\N\N\N |
  7. | \N | \N\N\N\NXXX - ABCDEFGH\N |
  8. | \N | \N\N |
  9. | \N | \N\N\N |
  10. | \N | \N |
  11. +--------+----------------------------------+

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

基本上,我想检索的是:

  1. +--------+----------------------------------+
  2. | reason | string |
  3. +--------+----------------------------------+
  4. | \N | XXX - ABCDEFGH |
  5. +--------+----------------------------------+

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

  1. Select
  2. path.path.reason,
  3. path.path.string
  4. From table_name
  5. Where path.id = '123'
  6. And datestr = '2018-07-21'
kknvjkwl

kknvjkwl1#

这个正则表达式将为您完成这项工作 ([^\N$])+ .
假设图像中显示的角色是 $ .
首先,你可以使用 regexp_extract() 检索特定数组元素。它具有以下语法:

  1. regexp_extract(string subject, string pattern, int index)

第二,你可以使用 regexp_replace 具有以下语法:

  1. regexp_replace(string INITIAL_STRING, string PATTERN, string REPLACEMENT)

试验数据

  1. WITH string_column
  2. AS (SELECT explode(array('XXX - ABCSSSSSSSSSSSGH\N\N',
  3. '\N$\N$\N$\N$XXX - ABCDEFGH$\N\N',
  4. '\N\N\N\N', '\N\N\N\NXXX - ABCDEFGH\N')) AS
  5. str_column
  6. )
  7. SELECT regexp_replace(regexp_extract(str_column, '([^\N$])+', 0), "$", " ")
  8. AS string_col
  9. FROM string_column

将导致

  1. ------------------------------
  2. | string_col |
  3. ------------------------------
  4. | XXX - ABCSSSSSSSSSSSGH |
  5. ------------------------------
  6. | XXX - ABCDEFGH |
  7. ------------------------------
  8. | |
  9. ------------------------------
  10. | XXX - ABCDEFGH |
  11. ------------------------------

注意:指定索引的“0”在基于模式的提取之后生成匹配。

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

下面的语句将替换出现的任何“$”

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

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

展开查看全部

相关问题