Datetime Apache Pig从时间戳到日期

Datetime Apache Pig从时间戳到日期,datetime,hadoop,apache-pig,hortonworks-data-platform,ambari,Datetime,Hadoop,Apache Pig,Hortonworks Data Platform,Ambari,我试图用amabari中的ApachePig分析一些数据 在这种情况下,我有一个问题。。。我有一个列,它的时间戳是用这种特定的格式写的 1433306146000 1422814565122 使用在线转换器,如果我输入1433306146000,输出为08/30/47389@12:06pm(UTC),但这不是真的,事实上,如果我手动删除最后3个数字(1433306146),结果是06/03/2015@4:35am(UTC) 所以,在pig中有一种方法可以删除时间戳列中的最后3个数字? 还有一

我试图用amabari中的ApachePig分析一些数据

在这种情况下,我有一个问题。。。我有一个列,它的时间戳是用这种特定的格式写的

1433306146000

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

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

GetDay(日期时间)

如果我通过时间戳,它会工作吗?或者有一种不同的方法,从时间戳开始,生成关联的周日


谢谢

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

GetDay(ToDate(1433306146000))

注意:如果确实要删除3个数字,请将数据作为字符加载并使用函数。

@inquisitive\u mind我尝试了完整字符串(包括偏移量),但无效,错误为:

“无效格式1422762920000在0000处格式不正确”

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

SUBSTRING grp=FOREACH y GENERATE(时间戳),SUBSTRING(时间戳,0,9)

然后我将其存储到一个新文件中,以便自由操作。生成的输出是两列:第一列是原始时间戳,第二列是没有最后三个字符的新时间戳,因此我尝试启动此新脚本:

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),
我绝望了

不确定时间戳使用了哪个转换器,但它显示的是propper格式。ToDate运算符不作用于复杂的数据类型,如bag。这就是为什么在组上使用时会出现错误。此外,有时chararray的行为是不可预测的,因此经验法则是使用长基元类型作为时间戳。下面的代码应该可以工作

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
干杯

你好,好奇的,谢谢你的回答!我试着像这样做y=LOAD'../Fra/mydata/*'AS(user\u id:chararray,event\u id:chararray,timestamp:chararray);grp=按时间戳划分的y组;result=foreach grp{GetDay(ToDate(grp);}dump result;第一个问题是pig如何识别时间戳,我认为是chararray,第二个问题是解析过程中出现错误(可能不止一个,对不起,但我是noob)异常……您能帮我解决这个问题吗?Thanks@Fraangel结果=foreach grp generate GetDay(ToDate(group));转储结果;我以注释的形式回答您,因为文本太长,无法给出答案!生成的结果是每月的一天(从1到31),但如果我只想要每周的几天(从1到7)?例如,1是星期天…我能做什么?您可以使用宏将天转换为数字,也可以使用7个条件语句显示我能使用它吗?我是一个noob…但我尝试了这种方法result=FOREACH input GENERATE GetDay(ToDate((long)old_timestamp%7)但它不起作用!它不会像您希望的那样在工作日工作。我建议编写一个Python(更容易)UDF来提取您想要的内容。这里有很多示例。