2

データのサンプル行がいくつかあるとしましょう

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 文字列) '^' で終わる ROW 形式の区切りフィールド。

ご覧のとおり、url パラメータに抽出したいデータがいくつかあります。つまり、datacoll=5|4|3|2|1 です。

また、パイプで区切られた個々の要素を操作したいので、グループ化して、たとえば、この場合は 2 行になる "4" の 2 番目の位置を持つ URL の数を示すことができます。したがって、この場合、解析してクエリで使用したい追加データを含む「url」フィールドがあります。

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

ありがとう!

4

2 に答える 2

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'), '\|')

この結果、必要な列を取得できるはずです。

その他の組み込み関数については、UDF のドキュメントを参照してください。

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

于 2012-04-19T11:12:53.193 に答える
1

これは、私が数週間前に行ったことと非常によく似ています。あなたの場合の最善のアプローチは、前処理ステップ (おそらく Hadoop ストリーミングを使用) を適用し、テーブルのプロトタイプを次のように変更することだと思います。

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

それができたら、ラテラル ビューと組み込みの を使用して、Hive でデータを簡単に操作できますexplode。次のコードは、列ごとの URL の数を取得するのに役立ちます。

select col, count(1) from clicklogs lateral view explode(datacol) dataTable as col group by col
于 2012-04-19T05:28:12.130 に答える