Apache Pig从时间戳到日期

时间:2016-05-14 14:29:44

标签: datetime hadoop apache-pig hortonworks-data-platform ambari

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

在这种特殊情况下我遇到了问题......我有一个列,其中包含以这种特定格式编写的时间戳

1433306146000

1422814565122

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

那么,猪的方法是删除时间戳列中的最后3个数字吗? 而且主要问题是:功能

  

GetDay(日期时间)

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

谢谢

3 个答案:

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