我正在用阿玛巴里的apache pig分析一些数据
在这种情况下,我有一个问题。。。我有一列时间戳是用这种特定格式写的
1433306146000
1422814565122
使用在线转换器,如果我输入1433306146000,输出是08/30/47389@12:06pm(utc),但这不是真的,事实上,如果我手动删除最后3个数字(1433306146),结果是06/03/2015@4:35am(utc)。
所以,在pig中有一个方法可以删除timestamp列中的最后3个数字吗?而且主要的问题是:用功能
getday(日期时间)
如果我传递时间戳,它会工作吗?或者有一个不同的方法来产生,从时间戳,关联周日?
谢谢
3条答案
按热度按时间nfzehxib1#
@好奇的我尝试了完整的字符串(包括偏移量),但不起作用,错误是:
“无效格式1422762920000在0000处格式不正确”
所以我试着这样使用子串
SUBSTRING grp = FOREACH y GENERATE (timestamp),SUBSTRING(timestamp,0,9);
然后我将其存储到一个新文件中,以便在freedom中对其进行操作。生成的输出是两列:第一列是原始时间戳,第二列是没有最后三个字符的新时间戳,因此我尝试启动这个新脚本:输出为:
“…无效格式1422762920在0处格式错误”
因此,即使我知道在从previus代码中删除另一个字符时,我也会尝试更改子字符串函数的范围(timestamp,0,10)。现在我试图重新启动脚本,但输出是(1),(1),(1),(1),(1),我绝望了!
htrmnn0y2#
您得到的是1970-01-01t00:00:00.000z的偏移量,以毫秒为单位。您可以将该毫秒传递给todate。它以unix timestamp作为输入并返回datetime对象。一旦你得到datetime对象,你就可以使用getday函数了。不需要删除最后3个数字
note:if you 确实要删除3个数字,然后将数据加载为chararray并使用substring函数。
ia2d9nvy3#
不确定您使用了哪个转换器作为时间戳,但这里显示的是propper格式。todate操作符不作用于复杂的数据类型,如bag。这就是为什么在组中使用它时会出错的原因。有时chararray的行为是不可预测的,因此经验法则是对时间戳使用long原语类型。下面的代码应该有用。
另外,如果您不想更改模式,也可以将chararray转换为long。只有这样才会改变:
还要注意,todate总是需要一毫秒的时间,所以如果您将它们切断,您将看到unix默认的开始时间是1970-01-01 cheers!