3

hive -e "QUERY" 構文を使用して次のクエリを作成するにはどうすればよいですか。理由は、クエリ自体に二重引用符と % が含まれているためです。

create external table tmp2(logdate string, time string, computername string, clientip string, uri string, qs string, localfile string, status string, referer string, w3status string, sc_bytes string, cs_bytes string, w3wpbytes string, cs_username string, cs_user_agent string, time_local string, timetakenms string, sc_substatus string, s_sitename string, s_ip string, s_port string, RequestsPerSecond string, s_proxy string, cs_version string, c_protocol string, cs_method string, cs_Host string, EndRequest_UTC string, date_local string, CPU_Utilization string, cs_Cookie string, BeginRequest_UTC string) ROW FORMAT SERDE
    'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'
                   WITH SERDEPROPERTIES (
                   "input.regex" ="([0-9-]+) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) (\".*\"|[^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) (\".*\"|[^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) (\".*\"|[^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([0-9-]+ [0-9:.]+) ([^ ]*) ([^ ]*) (\".*\"|[^ ]*) ([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 %10$s %11$s %12$s %13$s %14$s %15$s %16$s %17$s %18$s %19$s %20$s %21$s %22$s %23$s %24$s %25$s %26$s %27$s %28$s %29$s %30$s %31$s %32$s")
4

2 に答える 2

2

これは、Hive への送信方法に完全に依存します。コマンドラインから実行するだけで、二重引用符の標準的なエスケープ規則に従う必要があります。二重引用符内に引用符がある場合は、バックスラッシュでエスケープする必要があります。同様に、バックスラッシュを別のバックスラッシュでエスケープする必要があります。

また、必ず改行を引用符内でエスケープしてください。

例を次のように単純化すると、次のようになります。

create external table tmp2(logdate string, time string) ROW FORMAT SERDE
'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
    "input.regex" = "(\".*\"|[^ ]*) (\".*\"|[^ ]*)",
    "output.format.string"="%1$s %2$s")

次に、次のようにコマンドラインから実行できるようにする必要があります。

hive -e "create external table tmp2(logdate string, time string) ROW FORMAT SERDE \
'org.apache.hadoop.hive.contrib.serde2.RegexSerDe' \
WITH SERDEPROPERTIES ( \
    \"input.regex\" = \"(\\\".*\\\"|[^ ]*) (\\\".*\\\"|[^ ]*)\", \
    \"output.format.string\"=\"%1$s %2$s\")"

質問を投稿する前に、質問を単純化することをお勧めします。単純化することで問題が解決する場合があります。

于 2015-09-02T23:39:25.297 に答える
0

トリプルバックスラッシュを使用する必要があります

于 2013-09-26T12:26:16.170 に答える