您可以在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的列表;但可能會有比這更復雜的表格。
如何計算3個數據點的結果?你期望結果是什麼? – libjack
3個數據點的結果將如下所示: 1 | X11 | X12 | T11 | Y11 1 | X21 | X22 | T12 | Y12 1 | X31 | X31 | T13 | Y13 –
這裏是什麼,什麼是|意思 ? – KaKa