首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将蜂巢中的一组行减少为另一组行

将蜂巢中的一组行减少为另一组行
EN

Stack Overflow用户
提问于 2012-12-25 07:59:34
回答 1查看 927关注 0票数 0

我用蜂巢对空间数据库进行批量处理。我的跟踪表如下所示:

代码语言:javascript
复制
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-还原和蜂箱使用转换,但我不知道如何做到这一点。有人能帮帮我吗?

EN

回答 1

Stack Overflow用户

发布于 2012-12-27 20:18:02

您可以在Hive中使用自定义映射减少功能。

有以下几点:

代码语言:javascript
复制
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包含跟踪数据:

代码语言:javascript
复制
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长字段的脚本):

代码语言:javascript
复制
#!/usr/bin/perl
while (<STDIN>) {
    print;
}

collect.pl (sample 这里)是一个简单的脚本,它收集具有相同对象id的连续行,保存每一行的其余部分,并用id和逗号分隔列表(制表符分隔符)转储一行。

集群by子句将确保约简器获得收集脚本所需的正确排序输入。

用户脚本的输出是选项卡分隔的字符串列。

运行查询,将产生以下输出:

代码语言:javascript
复制
1       X11,X12,T11,X21,X22,T12,X31,X22,T13
2       X11,X12,T21,X21,X22,T22

您可以修改映射脚本以限制列,和/或修改减少脚本以添加结果或将lat、lon与ts分离,等等。

如果此表单足够,则可以通过在“还原”之前添加一个insert来直接插入结果表:

代码语言:javascript
复制
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的架构。

如果像我一样使用集合类型,还可以执行以下操作:

代码语言:javascript
复制
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的列表;但可能会有一个更复杂的表。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14028796

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档