从时间戳到现在的 Apache Pig

Apache Pig from timestamp to date

我正在尝试使用 amabari 中的 apache pig 分析一些数据

在这种特定情况下,我遇到了问题...我有一列时间戳以这种特定格式编写

1433306146000

1422814565122

使用在线转换器,如果我输入 1433306146000,输出为 08/30/47389 @ 12:06pm(UTC),但事实并非如此,事实上,如果我手动删除最后 3 个数字(1433306146 ) 结果是 06/03/2015 @ 4:35am (UTC).

那么,pig 中有一种方法可以删除时间戳列中的最后 3 个数字吗? 还有主要问题是:函数

GetDay(datetime)

如果我传递时间戳,它会起作用吗?或者有不同的方法从时间戳中生成关联的工作日?

谢谢

你所拥有的是从 1970-01-01T00:00:00.000Z 的偏移量 milliseconds.You 可以将那毫秒传递给 ToDate 。它将 Unix 时间戳作为输入并且 returns 日期时间对象。一旦你得到日期时间对象,你就可以使用 GetDay function.No 需要删除最后 3 个数字

GetDay(ToDate(1433306146000))

注意:如果您真的想删除 3 个数字,则将数据加载为字符数组并使用 SUBSTRING 函数。

@inquisitive_mind 我尝试了完整的字符串(包括偏移量)但它不起作用,错误是:

"invalid format 1422762920000 is malformed at 0000"

所以我尝试以这种方式使用子字符串

SUBSTRING grp = FOREACH y GENERATE (timestamp),SUBSTRING(timestamp,0,9);

然后我将它存储到一个新文件中以便在 freedom.The 中操作它产生的输出是两个列:第一个是原始时间戳,第二个是新时间戳,没有最后三个字符,所以我尝试启动这个新脚本:

y=LOAD '..Fra/data/prova/*' as (old_timestamp:chararray,timestamp:chararray);
grp=group y by timestamp;
result=foreach grp generate GetDay(ToDate(group));
dump result;

输出为:

"...invalid format 1422762920 malformed at 0"

因此,即使我知道在从以前的代码中删除另一个字符时,我也会尝试更改子字符串函数的范围 (timestamp,0,10)。现在我试图重新启动脚本,但产生的输出是 (1),(1),(1),(1),(1), 我很绝望!

不确定您为时间戳使用了哪个转换器,但here它显示了正确的格式。 ToDate 运算符不作用于 bag 等复杂数据类型。这就是为什么您尝试在组中使用它时出错的原因。此外,有时 chararray 的行为是不可预测的,因此经验法则是使用 long 基本类型作为时间戳。下面的代码应该可以工作。

input=LOAD '..Fra/data/prova/*' AS(old_timestamp:long,timestamp:long);
result=FOREACH input GENERATE 
  GetDay(ToDate(old_timestamp)),
  GetDay(ToDate(timestamp));
DUMP result; 

此外,如果您不想更改架构,显然也可以在您的情况下从 chararray 转换为 long。只有这个会改变:

result=FOREACH input GENERATE 
  GetDay(ToDate((long)old_timestamp)),
  GetDay(ToDate((long)timestamp));

还要注意 ToDate 总是需要一毫秒,所以如果你将它们切断,你会看到 Unix 默认开始时间 1970-01-01 干杯!