apache pig从时间戳到日期

yv5phkfx  于 2021-05-29  发布在  Hadoop
关注(0)|答案(3)|浏览(536)

我正在用阿玛巴里的apache pig分析一些数据
在这种情况下,我有一个问题。。。我有一列时间戳是用这种特定格式写的

1433306146000

1422814565122

使用在线转换器,如果我输入1433306146000,输出是08/30/47389@12:06pm(utc),但这不是真的,事实上,如果我手动删除最后3个数字(1433306146),结果是06/03/2015@4:35am(utc)。
所以,在pig中有一个方法可以删除timestamp列中的最后3个数字吗?而且主要的问题是:用功能
getday(日期时间)
如果我传递时间戳,它会工作吗?或者有一个不同的方法来产生,从时间戳,关联周日?
谢谢

nfzehxib

nfzehxib1#

@好奇的我尝试了完整的字符串(包括偏移量),但不起作用,错误是:
“无效格式1422762920000在0000处格式不正确”
所以我试着这样使用子串 SUBSTRING grp = FOREACH y GENERATE (timestamp),SUBSTRING(timestamp,0,9); 然后我将其存储到一个新文件中,以便在freedom中对其进行操作。生成的输出是两列:第一列是原始时间戳,第二列是没有最后三个字符的新时间戳,因此我尝试启动这个新脚本:

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;

输出为:
“…无效格式1422762920在0处格式错误”
因此,即使我知道在从previus代码中删除另一个字符时,我也会尝试更改子字符串函数的范围(timestamp,0,10)。现在我试图重新启动脚本,但输出是(1),(1),(1),(1),(1),我绝望了!

htrmnn0y

htrmnn0y2#

您得到的是1970-01-01t00:00:00.000z的偏移量,以毫秒为单位。您可以将该毫秒传递给todate。它以unix timestamp作为输入并返回datetime对象。一旦你得到datetime对象,你就可以使用getday函数了。不需要删除最后3个数字

GetDay(ToDate(1433306146000))

note:if you 确实要删除3个数字,然后将数据加载为chararray并使用substring函数。

ia2d9nvy

ia2d9nvy3#

不确定您使用了哪个转换器作为时间戳,但这里显示的是propper格式。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 cheers!

相关问题