Hadoop Pig中基于时间的数据过滤

Hadoop Pig中基于时间的数据过滤,hadoop,apache-pig,Hadoop,Apache Pig,我现在正在本地模式下使用Pig 0.11.1,从CSV加载数据 到目前为止,我已经能够加载我们的数据集并对其执行所需的计算。下一步是从数据中提取一些样本并执行相同的计算。为了复制现有流程,我们希望每十五分钟获取一个数据点 这就是问题所在。我可以用Pig编写一个过滤器,如果一个数据点正好在15分钟的间隔上,它将匹配,但是我如何获取接近15分钟边界的数据点呢 我需要看一下15分钟的记录,然后抓住那张记录。如果该标记上没有正确的记录(很可能),那么我需要获取该标记后的下一条记录 我想我需要编写自己的过

我现在正在本地模式下使用Pig 0.11.1,从CSV加载数据

到目前为止,我已经能够加载我们的数据集并对其执行所需的计算。下一步是从数据中提取一些样本并执行相同的计算。为了复制现有流程,我们希望每十五分钟获取一个数据点

这就是问题所在。我可以用Pig编写一个过滤器,如果一个数据点正好在15分钟的间隔上,它将匹配,但是我如何获取接近15分钟边界的数据点呢

我需要看一下15分钟的记录,然后抓住那张记录。如果该标记上没有正确的记录(很可能),那么我需要获取该标记后的下一条记录

我想我需要编写自己的过滤器UDF,但UDF似乎需要是有状态的,以便它知道在时间间隔后何时找到第一个匹配项。我还没有找到任何有状态UDF的例子,从我所能看出这可能是一个坏主意,因为我们不知道最终在Hadoop上运行时数据是如何映射/减少的

我可以通过存储键/时间戳值并编写一个Python脚本来解析这些值,通过几个步骤来实现这一点。不过,我真的希望尽可能多地将这个过程保存在Pig中


编辑:最基本的数据如下:
{id:long,timestamp:long}
时间戳
以毫秒为单位。每组数据按
时间戳
排序。如果记录X正好落在最小
时间戳
(开始时间)之后的15分钟边界上,则抓住它。否则,在15分钟的边界之后,抓住下一个记录,无论何时。我没有一个很好的例子来说明预期的结果是什么,因为我没有时间手动对数据进行排序。

在MapReduce中,要满足条件“否则,在15分钟的边界之后抓取下一条记录,无论何时”,可能会很棘手,但如果您稍微将其更改为“在15分钟界限之前抓取上一条记录”可能会非常简单。想法是15分钟等于900000毫秒,因此我们可以将记录分组为涵盖900000毫秒的组,对它们进行排序,然后取最上面的一条。下面是我脑海中的脚本示例:

inpt = LOAD '....' AS (id:long, timestamp:long);
intervals = FOREACH inpt GENERATE id, timestamp, timestamp / 900000 as interval;
grp = GROUP intervals BY interval;
result = FOREACH grp {
    sort = ORDER intervals BY timestamp DESC;
    top = LIMIT ord 1;
    GENERATE FLATTEN(top);
};

您能否提供一个示例,说明您的数据以及您希望将哪些记录保存在过滤器中?这是一个很好的解决方案!没有自定义项,就没有流式处理。(虽然15分钟实际上是900000毫秒,而不是9000000毫秒。)