【Hive】Hive / HiveQL ~ HiveQL関数・regexp_replace編 ~

■ はじめに

https://dk521123.hatenablog.com/entry/2020/03/10/224640

の続き。

 長いHQLを実行した際にエラーになったので、
その長いHQLのサブクエリを単独で実行してどこに原因があるかを
調査していた。

その際、regexp_replace を使っていたので、メモしておく。

目次

【1】regexp_replace()
【2】構文
 第二引数:PATTERN について
【3】サンプル
 例1:簡単な例
 例2:特殊文字の置き換え
 例3:複数の特殊文字の置き換え
 例4:regexp_replaceのネスト
 例5:特殊文字の置き換え+CASE文

【1】regexp_replace()

* 正規表現(REGular EXPression)による文字列の置き換え (replace)

【2】構文

-- PATTERN で定義されている Java 正規表現構文と
-- 一致する INITIAL_STRING 内の条件にREPLACEMENTを置き換える
regexp_replace(
  string INITIAL_STRING,
  string PATTERN,
  string REPLACEMENT)

第二引数:PATTERN について

* 複数していた場合、「|」で区切って指定

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF#LanguageManualUDF-StringFunctions

より抜粋
~~~~~~
For example, regexp_replace("foobar", "oo|ar", "") returns 'fb.'
~~~~~~
=> 「oo」又は「ar」を ""(空行) で置き換わったので「fb」
  (「.」はミス?)

Java 正規表現構文
https://docs.oracle.com/javase/jp/8/docs/api/java/util/regex/Pattern.html

【3】サンプル

例1:簡単な例

hive> SELECT REGEXP_REPLACE('Hello world, Mike!','Mike','Tom');

OK
Hello world, Tom!

例2:特殊文字の置き換え

hive> SELECT REGEXP_REPLACE('Hello world!!!','\\!','\\.');

OK
Hello world...

例3:複数の特殊文字の置き換え

hive> SELECT REGEXP_REPLACE('Hello world!#+','\\!|\\#|\\+','\\.');

OK
Hello world...

例4:regexp_replaceのネスト

hive> SELECT 
REGEXP_REPLACE(REGEXP_REPLACE(
UPPER('hello\\world\\"!!'),'\\!|\\\\|\\"',' '), '( )+', '');

OK
HELLOWORLD

例5:特殊文字の置き換え+CASE文

-- ex1
hive> SELECT CASE
 WHEN REGEXP_REPLACE(UPPER('u.s.a'), '\\.', '') IN ('USA',  'US')
 THEN 'USA' ELSE 'Other' END;

OK
USA

-- ex2
hive> SELECT CASE
WHEN REGEXP_REPLACE(REGEXP_REPLACE(
UPPER('hello\\world\\"!!'),'\\!|\\\\|\\"',' '), '( )+', '') 
IN ('HELLO', 'WORLD', 'HELLOWORLD') 
THEN 'This is a Hello world!'
ELSE 'NOT Hello world...'
END;

OK
This is a Hello world!

-- CASE文:CASE WHEN <condition> THEN <result1> ELSE <result2> END;
-- 詳細は、以下の関連記事を参照のこと

Hive / HiveQL ~ CASE文 ~
https://dk521123.hatenablog.com/entry/2021/06/19/073248

参考文献

https://community.cloudera.com/t5/Support-Questions/How-to-use-regexp-replace-in-hive-to-remove-special/td-p/233568

関連記事

Hive / HiveQL ~ 基礎知識編 ~
https://dk521123.hatenablog.com/entry/2019/11/25/235219
Hive / HiveQL ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2020/02/25/231235
Hive / HiveQL ~ 基本編 ~
https://dk521123.hatenablog.com/entry/2020/06/02/183823
Hive / HiveQL ~ CASE文 ~
https://dk521123.hatenablog.com/entry/2021/06/19/073248
Hive / HiveQL ~ HiveQL関数 / 文字列置換編 ~
https://dk521123.hatenablog.com/entry/2020/03/10/224640
Hive / HiveQL ~ HiveQL関数・文字列関数編 ~
https://dk521123.hatenablog.com/entry/2021/06/21/231033
Hive / HiveQL ~ HiveQL関数 / NULL関連編 ~
https://dk521123.hatenablog.com/entry/2021/06/22/213241
Hive / HiveQL ~ 日時操作編 ~
https://dk521123.hatenablog.com/entry/2021/02/11/233633
Apache Hive ~ HiveQL / あれこれ編 ~
https://dk521123.hatenablog.com/entry/2020/03/04/225943
Hive / HiveQL ~ データをクリーニングする ~
https://dk521123.hatenablog.com/entry/2020/07/06/232350