1

ハイブは初めてで、スペースで区切られたデータで使用したいと考えています。引用符 ("") で囲まれたものをグループ化する既存の方法はありますか?

4

2 に答える 2

2

1つの方法は、上記のTariqが語ったとおりです。もう 1 つは正規表現の定義です。

必要に応じて正規表現を定義するために、Hive のRegexSerDe クラスを使用できます。
例を見てみましょう:

Apache アクセス ログには、次の形式のサンプル データがあります。

10.243.31.1 - - [23/Aug/2013:16:38:07 +0530] "POST /Haas/controller/main.php HTTP/1.1" 200 26 "http://10.232.5.169:81/Haas/view/dashboard.php" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36"
10.243.31.1 - - [23/Aug/2013:16:38:07 +0530] "POST /Haas/controller/main.php HTTP/1.1" 200 31 "http://10.232.5.169:81/Haas/view/dashboard.php" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36"
10.243.31.1 - - [23/Aug/2013:16:38:13 +0530] "POST /Haas/controller/main.php HTTP/1.1" 200 31 "http://10.232.5.169:81/Haas/view/dashboard.php" "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36"

次に、その正規表現を定義し、このデータをハイブ テーブルに格納します。したがって、Hive テーブル スキーマは次のようになります。

CREATE TABLE apache_log(
  host STRING,
  identity STRING,
  user STRING,
  time STRING,
  request STRING,
  status STRING,
  size STRING,
  referer STRING,
  agent STRING)
ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
  "input.regex" = "([^ ]*) ([^ ]*) ([^ ]*) (-|\\[[^\\]]*\\]) ([^ \"]*|\"[^\"]*\") (-|[0-9]*) (-|[0-9]*)(?: ([^ \"]*|\"[^\"]*\") ([^ \"]*|\"[^\"]*\"))?",
  "output.format.string" = "%1$s %2$s %3$s %4$s %5$s %6$s %7$s %8$s %9$s"
)
STORED AS TEXTFILE;

詳細については、GettingStarted#DDL_Operationsを参照してください。

于 2013-08-26T10:23:38.633 に答える