2012-12-25 11 views
0

我正在使用Hive來批量處理我的空間數據庫。我跟蹤表看起來是這樣的:將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個數據點中的每一個映射到一個數字。無法逐一處理它們。

我想使用map-reduce與配置單元使用變換,但我不知道如何做到這一點。有人可以幫我嗎?

+0

如何計算3個數據點的結果?你期望結果是什麼? – libjack

+0

3個數據點的結果將如下所示: 1 | X11 | X12 | T11 | Y11 1 | X21 | X22 | T12 | Y12 1 | X31 | X31 | T13 | Y13 –

+0

這裏是什麼,什麼是|意思 ? – KaKa

回答

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和逗號分隔列表(標籤分隔符)排出一行。

集羣由子句將確保reducer得到收集腳本所需的正確排序的輸入。

用戶腳本的輸出以製表符分隔STRING列。

運行查詢,將導致以下的輸出:

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

您可以修改映射腳本來限制列,和/或修改減少腳本從添加的結果或分開的緯度,經度在TS等

如果這種形式是足夠的,你可以通過減少前加入插入直接插入到一個結果表:

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; 

在創建表這第二場將是所有的緯度,經度,TS的列表;但可能會有比這更復雜的表格。

相關問題