0

空間データベースのバッチ処理に Hive を使用しています。私のトレース テーブルは次のようになります。

object | lat  | long  | timestamp

1      | X11  | X12   | T11

1      | X21  | X22   | T12

2      | X11  | X12   | T21

1      | X31  | X22   | T13

2      | X21  | X22   | T22

各オブジェクトの各緯度経度を数値にマップしたい (たとえば、マップ マッチングについて考えてください) が、アルゴリズムは結果を得るために隣接するデータ ポイントの数を考慮する必要があります。たとえば、オブジェクト 1 の 3 つのデータ ポイントのそれぞれを数値にマッピングするには、3 つのデータ ポイントすべてが必要です。1つずつ処理することはできません。

変換を使用してハイブでマップリデュースを使用することを考えていますが、これの方法がわかりません。誰かが私を助けてくれますか?

4

1 に答える 1

2

Hive でカスタム マップ削減機能を使用できます。

以下を使用します。

add file /some/path/identity.pl;
add file /some/path/collect.pl;

from (
  from trace_input
  MAP id, lat, lon, ts
  USING './identity.pl'
  as id, lat, lon, ts
 CLUSTER BY id) map_output
REDUCE id, lat, lon, ts
USING './collect.pl' as id, list

trace_inputには、上記のトレース データが含まれます。

create table trace_input(id string, lat string, lon string, ts string)
row format delimited
fields terminated by '\t'
stored as textfile ;

identity.plは、各行をダンプする単純なスクリプトです (緯度と経度のフィールドだけを選択するスクリプトでもかまいません)。

#!/usr/bin/perl
while (<STDIN>) {
    print;
}

collect.pl (サンプルはこちら) は、同じオブジェクト ID を持つ連続した行を収集し、各行の残りを保存し、ID とカンマ区切りのリスト (タブ区切り) を使用して行をダンプする単純なスクリプトです。

cluster by句は、reducer が collect スクリプトに必要な正しくソートされた入力を取得することを保証します。

ユーザー スクリプトの出力は、タブで区切られたSTRING列です。

クエリを実行すると、次の出力が得られます。

1       X11,X12,T11,X21,X22,T12,X31,X22,T13
2       X11,X12,T21,X21,X22,T22

map スクリプトを変更して列を制限したり、reduce スクリプトを変更して結果を追加したり、緯度、経度を ts から分離したりすることができます。

この形式で十分な場合は、reduce の前に挿入を追加して、結果テーブルに直接挿入できます。

from (
  from trace_input
  MAP id, lat, lon, ts
  USING './identity.pl'
  as id, lat, lon, ts
 CLUSTER BY id) map_output
INSERT overwrite table trace_res
REDUCE id, lat, lon, ts
USING './collect.pl';

フィールドは、必要に応じて文字列フィールドから trace_res のスキーマに一致するように変換されます。

私のようにコレクション型を使用する場合は、次のようなこともできます。

create table trace_res as
select sq.id, split(sq.list,",") from
(
from (
  from trace_input
  MAP id, lat, lon, ts
  USING './identity.pl'
  as id, lat, lon, ts
 CLUSTER BY id) map_output
REDUCE id, lat, lon, ts
USING './collect.pl' as (id int, list string)
) sq;

作成されたテーブルのこの 2 番目のフィールドは、すべての緯度、経度、経度のリストになります。しかし、おそらくそれよりも複雑なテーブルを持つでしょう。

于 2012-12-27T20:18:02.890 に答える