Mapreduce &引用;减少;配置单元中的一组行到另一组行
我正在使用Hive对我的空间数据库进行批处理。我的跟踪表如下所示:Mapreduce &引用;减少;配置单元中的一组行到另一组行,mapreduce,hive,hiveql,Mapreduce,Hive,Hiveql,我正在使用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 我想把每个对象的每个LAT映射成一个数字(例如,考虑地图匹配),但是算法
object | lat | long | timestamp
1 | X11 | X12 | T11
1 | X21 | X22 | T12
2 | X11 | X12 | T21
1 | X31 | X22 | T13
2 | X21 | X22 | T22
我想把每个对象的每个LAT映射成一个数字(例如,考虑地图匹配),但是算法需要考虑多个相邻的数据点来得到结果。例如,我需要对象1的所有3个数据点将这3个数据点映射到一个数字。无法逐个处理它们
我正在考虑使用map reduce和使用transform的hive,但我不确定如何实现这一点。有人能帮我吗?您可以使用Hive中的自定义map reduce功能 以下是:
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
跟踪\u输入包含上述跟踪数据:
create table trace_input(id string, lat string, lon string, ts string)
row format delimited
fields terminated by '\t'
stored as textfile ;
identity.pl是一个用于转储每一行的简单脚本(也可以是一个仅选择lat长字段的脚本):
您可以修改映射脚本以限制列,和/或修改reduce脚本以添加结果或将lat、lon与ts等分开
如果此表单足够,可以通过在reduce之前添加insert直接插入到结果表中:
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;
创建表中的第二个字段将是所有lat、lon、ts的列表;但可能会有一个比这更复杂的表格。如何计算这3个数据点的结果?你期望结果是什么?3个数据点的结果将是这样的:1 | X11 | X12 | T11 | Y11 | X21 | X22 | T12 | Y12 | X31 | T13 | y13这里的Y是什么意思?
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';
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;