如何解決 Amazon Athena 中的「相符的群組數目與欄數目不相符」RegexSerDe 錯誤?

1 分的閱讀內容
0

我使用 RegExserde 建立了 Amazon Athena 表格。當我查詢此表格時,收到以下錯誤: 「相符的群組數目與欄數目不相符」。

解決方法

若要解決此錯誤,請確認 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

該列有七個欄位。以下是正確的 regex 模式:

^([0-9.]+) ([\\w.-]) ([\\w.-]) \\[([A-Za-z0-9:/]+ [+-][0-9]{4})\\] \"(.+?)\" ([0-9]{3}) ([0-9]+)$

**注意:**RegexSerDe 採用 Java 標準。由於反斜線是 Java String 類別中的逸出字元,您必須使用雙反斜線來定義單反斜線。例如,要定義 \w,您必須在 regex 中使用 \w。

在此 regex 模式有七個擷取群組,且輸入資料中有七個欄位。當查詢此表格時,RegexSerDe 不會擲回「相符的群組數目與欄數目不相符」的例外狀況。

如要執行 DDL 陳述式,請指定 SERDEPROPERTIES 的 regex 擷取群組,如下列範例所示:

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

AWS 官方
AWS 官方已更新 2 年前