我正在尝试用amabari中的apache pig分析一些数据
在这种特殊情况下我遇到了问题......我有一个列,其中包含以这种特定格式编写的时间戳
1433306146000
1422814565122
使用在线转换器如果我输入输入1433306146000输出是08/30/47389 @ 12:06 pm(UTC)但事实并非如此,实际上如果我手动删除最后3个数字(1433306146),结果是06/03/2015 @ 4:35(UTC)。
那么,猪的方法是删除时间戳列中的最后3个数字吗? 而且主要问题是:功能
GetDay(日期时间)
如果我通过时间戳它会起作用吗?或者从时间戳开始,有一种不同的方法来生成员工工作日?
谢谢
答案 0 :(得分:2)
不确定您用于时间戳的转换器,但here它显示了propper格式。 ToDate运算符不会对复杂数据类型(如bag)执行操作。这就是为什么你试图在组上使用它时会出错。有时候chararray的行为也是不可预测的,因此经验法则是使用长基本类型作为时间戳。下面的代码应该有效。
<html>
<head>
<TITLE>Welcome</TITLE>
</head>
<body>
<form action="checklogin.php" method="POST">
<div>
<strong>Username:</strong><input type="text" name="username"><br/>
<strong>Password:</strong><input type="password" name="password" ><br/>
<input type="submit" name="submit" value="Submit"><br/>
</div>
</form>
</body>
</html>
如果你不想改变架构,你也可以明显地从chararray投射到你的情况。只有这会改变:
<?php
//code for checklogin.php file
session_start();
echo "Hello world!";
include('sql_connect.db.php');
$uname=$_POST['username'];
$pass=$_POST['password'];
$result = mysql_query("SELECT * FROM users WHERE username=$uname");
$row=mysql_fetch_array($result);
$flag=0;
if($row)
$usp=$row['password'];
if (pass==usp){
$_SESSION['login_user'] = $uname;
header("location: success.php");
}else {
$error = "Your Login Name or Password is invalid";
}
?>
另外要注意ToDate总是需要一毫秒,所以如果你将它们剪掉,你会看到Unix默认的开始时间为1970-01-01 干杯!
答案 1 :(得分:0)
你所拥有的是从1970-01-01T00:00:00.000Z以毫秒为单位的偏移量。你可以将那个毫秒传递给ToDate。它将Unix时间戳作为输入并返回datetime对象。获得datetime对象后,可以使用GetDay函数。不需要删除最后3个数字
GetDay(ToDate(1433306146000))
注意:如果您确实要删除3个数字,请将数据加载为chararray并使用SUBSTRING函数。
答案 2 :(得分:0)
@inquisitive_mind我尝试了完整的字符串(包括偏移量),但它不起作用,错误是:
&#34;格式错误1422762920000格式错误在0000&#34;
所以我试图以这种方式使用子串
SUBSTRING grp = FOREACH y GENERATE (timestamp),SUBSTRING(timestamp,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;
输出是:
&#34; ...格式错误1422762920格式错误为0&#34;
所以,即使我知道在从previus代码中删除另一个char时我也会尝试,所以我改变了子串函数的范围(timestamp,0,10)。现在我试图重新删除脚本,但产生的输出是(1),(1),(1),(1),(1), 我绝望了!