某データを見ていたら、政令指定都市の場合に市区町村名が
千種区, 名古屋市
などと区, 市の順に並べて格納されており、正規化に難儀したので備忘録メモ。
解決したい課題・制約など
- 市区町村データの中に
区名, 市名
という具合にデリミタで区切られて逆順になっているレコードがある - それらをHIVEのクエリの中でデリミタを取り除き通常の順に並び替えたい
- それ以外は普通に
市町村名
となっているのでそれらに影響を与えないこと - HIVEのバージョンは1.1.0
解決例
HIVEのregexp_replace
が普通に後方参照を扱えるので、デリミタ前後をグループ化してキャプチャし$2$1
として入れ替える。
デリミタは今回の場合カンマ,
で、直後にスペースが入る可能性があったので,? *
とした。
名古屋市千種区でテスト
hive> select regexp_replace('千種区, 名古屋市', '^([^,]+),? *([^,]*)$', '$2$1');
OK
名古屋市千種区
正規表現の該当部分 | 該当した文字列 | 意味 |
---|---|---|
^ |
先頭 | |
([^,]+) |
千種区 | カンマ(, )以外の文字1文字以上。$1で参照される |
,? * |
, | デリミタの指定。カンマ(, )と、その後に空白が続くかもしれない |
([^,]*) |
名古屋市 | カンマ(, )以外の文字0文字以上、存在しないかもしれない。$2で参照される |
$ |
末尾 |
$1
が千種区
、$2
が名古屋市
になるので、$2$1
は名古屋市千種区
になる。
通常の市町村名の場合はそのままの値が戻ることを確認。
hive> select regexp_replace('春日井市', '^([^,]+),? *([^,]*)$', '$2$1');
OK
春日井市
正規表現の該当部分 | 該当した文字列 | 意味 |
---|---|---|
^ |
先頭 | |
([^,]+) |
春日井市 | カンマ(, )以外の文字1文字以上。$1で参照される |
,? * |
デリミタの指定。カンマ(, )と、その後に空白が続くかもしれない |
|
([^,]*) |
カンマ(, )以外の文字0文字以上、存在しないかもしれない。$2で参照される |
|
$ |
末尾 |
$2
が空になるので、$2$1
は春日井市
になる。