2012-04-19 12 views
2

のは、私がデータハイブで二重区切り文字を使用するにはどうすればよいですか?

私は テーブルclicklogs(サイト名の文字列、URL文字列)「^」で終了 ROW形式区切られたフィールドを作成するようにテーブルを作成したい
site1^http://article1.com?datacoll=5|4|3|2|1&test=yes 
site1^http://article1.com?test=yes 
site1^http://article1.com?datacoll=5|4|3|2|1&test=yes 

のいくつかのサンプル行を持っているとしましょう。

あなたは私がURLパラメータのいくつかのデータを持って見ることができるように私は、抽出したいつまり datacoll = 5 | 4 | 3 | 2 | 1

私も区切らこれらの個々の要素で仕事をしたいですパイプで、私はそれらの2つの行である "4"の2番目の位置を持っていた例をいくつかのURLを表示するためにグループバイスを行うことができます。したがって、この場合、私は「url」フィールドに追加のデータがあり、これを解析してクエリに使用したいと思います。

質問は、ハイブでそれを行う最善の方法は何ですか?

ありがとうございました!

答えて

3

まず、問題のデータをつかむためにparse_url(string urlString, string partToExtract [, string keyToExtract])を使用します。

parse_url('http://article1.com?datacoll=5|4|3|2|1&test=yes', 'QUERY', 'datacol1') 

これは途中でそこに私たちを取得する'5|4|3|2|1'を返します。さて、配列に各サブ区切り文字のうち、それらを破るためにsplit(string str, string pat)を使用します。

split(parse_url(url, 'QUERY', 'datacol1'), '\|') 

この結果では、あなたがしたい列をつかむことができるはずです。

さらに組み込み関数については、the UDF documentationを参照してください。

注:私はHiveでこれが動作しているかどうかを確認することはできませんでした。ごく小さな問題がある場合は申し訳ありません。

+0

完璧に感謝しました! – James

1

これは2,3週間前に行ったことと非常によく似ていますが、私の場合、最良の方法は前処理ステップ(おそらくハープストリーム)を適用し、テーブルのプロトタイプを変更することですされるように:

create table clicklogs(sitename string, datacol Array<int>) row format delimited fields terminated by '^' collection items terminated by '|' 

あなたは簡単に側面図および組み込みexplodeを使用してハイブでデータを操作できることをしたら。次のコードは、1列あたりのURLの数を取得するのに役立ちます。

select col, count(1) from clicklogs lateral view explode(datacol) dataTable as col group by col 
関連する問題