Mapreduce &引用;减少;配置单元中的一组行到另一组行

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映射成一个数字(例如,考虑地图匹配),但是算法

我正在使用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映射成一个数字(例如,考虑地图匹配),但是算法需要考虑多个相邻的数据点来得到结果。例如,我需要对象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;