RegexSerDe を使用して Amazon Athena のテーブルを作成しました。テーブルをクエリすると、「Number of matching groups doesn't match the number of columns.」(一致するグループの数が列の数と一致しません。) というエラーが表示されます。
解決方法
このエラーを解決するには、正規表現パターンでキャプチャするグループの数が、Athena でテーブルを作成したときに定義したフィールドの数と一致している必要があります。たとえば、1 行の入力データがあるとします。
64.xxx.xx.xx - - [07/Jul/2020:16:06:51 -0800] "GET /twiki/bin/rdiff/TWiki/NewUserTemplate?rev1=1.3&rev2=1.2 HTTP/1.1" 200 4523
この行には 7 個のフィールドがあります。正しい正規表現パターンを次に示します:
^([0-9.]+) ([\\w.-]) ([\\w.-]) \\[([A-Za-z0-9:/]+ [+-][0-9]{4})\\] \"(.+?)\" ([0-9]{3}) ([0-9]+)$
注: RegexSerDe は、Java 標準に準拠しています。バックスラッシュは Java String クラスのエスケープ文字であるため、1 つのバックスラッシュを、二重のバックスラッシュで記述する必要があります。たとえば、\w を定義するには、正規表現内で \w を使用する必要があります。
この正規表現パターンには、7 つのキャプチャグループがあり、入力データには 7 つのフィールドがあります。テーブルをクエリした場合には、RegexSerDe は、「Number of matching groups doesn't match the number of columns」例外をスローしません。
DDL 文を実行するには、次の例に示すように、SERDEPROPERTIES のための正規表現キャプチャグループを指定します。
CREATE EXTERNAL TABLE logs
(
col1 string,
col2 string,
col3 string,
col4 string,
col5 string,
col6 string,
col7 string
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
"input.regex" = "^([0-9.]+) ([\\w.-]) ([\\w.-]) \\[([A-Za-z0-9:/]+ [+-][0-9]{4})\\] \"(.+?)\" ([0-9]{3}) ([0-9]+)$")
LOCATION 's3://doc-example-bucket/path/'
関連情報
SerDe の使用