RegexSerDe를 사용해서 Amazon Athena 테이블을 생성했습니다. 테이블을 쿼리할 때 다음과 같은 오류가 발생합니다: "Number of matching groups doesn't match the number of columns."
해결 방법
이 오류를 해결하려면 regex 패턴에서 캡처하는 그룹 수가 Athena에서 테이블을 생성할 때 정의한 필드 수와 일치하는지 확인하십시오. 예를 들어, 다음은 입력 데이터 행입니다.
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
이 행에는 필드가 일곱 개 있습니다. 이것은 올바른 정규식 패턴입니다.
^([0-9.]+) ([\\w.-]) ([\\w.-]) \\[([A-Za-z0-9:/]+ [+-][0-9]{4})\\] \"(.+?)\" ([0-9]{3}) ([0-9]+)$
참고: RegexSerDe는 Java 표준을 따릅니다. 백슬래시는 Java String 클래스의 이스케이프 문자이므로 이중 백슬래시를 사용하여 단일 백슬래시를 정의해야 합니다. 예를 들어 \w를 정의하려면 regex에서 \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 사용