隐藏日期中的日期格式

时间:2015-12-10 12:33:04

标签: datetime hadoop twitter hive

我已经在hdfs中下载了twitter数据,并在其上成功创建了hive表。 Twitter在json文件中给出日期格式'Thu Dec 10 06:21:00 +0000 2015',我想将此格式转换为'yyy-MM-dd'我试过内置的hive函数,但它们不是接受twitter提供的格式。任何人都可以帮我转换这种格式。

3 个答案:

答案 0 :(得分:1)

也许UDF太过分了,你想要的只是一个快速修复,例如一些RegExp按摩那种丑陋的格式(警告:你的工作是根据各种Twitter日期彻底测试它,并相应地调整按摩)

select TWITTER_VOMIT
 , regexp_extract(TWITTER_VOMIT, '^[A-Z][a-z]* ([A-Z][a-z]*) ([0-9][0-9]*) .* ([0-9]*)$', 3) as YYYY
 , regexp_extract(TWITTER_VOMIT, '^[A-Z][a-z]* ([A-Z][a-z]*) ([0-9][0-9]*) .* ([0-9]*)$', 1) as MON
 , regexp_extract(TWITTER_VOMIT, '^[A-Z][a-z]* ([A-Z][a-z]*) ([0-9][0-9]*) .* ([0-9]*)$', 2) as DD
 , concat(regexp_extract(TWITTER_VOMIT, '^[A-Z][a-z]* ([A-Z][a-z]*) ([0-9][0-9]*) .* ([0-9]*)$', 3)
         ,case regexp_extract(TWITTER_VOMIT, '^[A-Z][a-z]* ([A-Z][a-z]*) ([0-9][0-9]*) .* ([0-9]*)$', 1)
            when 'Jan' then '-01-'
            when 'Feb' then '-02-'
            when 'Mar' then '-03-'
            when 'Apr' then '-04-'
            when 'May' then '-05-'
            when 'Jun' then '-06-'
            when 'Jul' then '-07-'
            when 'Aug' then '-08-'
            when 'Sep' then '-09-'
            when 'Oct' then '-10-'
            when 'Nov' then '-11-'
            when 'Dec' then '-12-'
            else '-**-'
          end
         ,regexp_extract(TWITTER_VOMIT, '^[A-Z][a-z]* ([A-Z][a-z]*) ([0-9][0-9]*) .* ([0-9]*)$', 2)
         ) as YYYY_MM_DD
from TWITTER_FEED

为您的例子

twitter_vomit                   yyyy  mon  dd  yyyy_mm_dd
Thu Dec 10 06:21:00 +0000 2015  2015  Dec  10  2015-12-10

答案 1 :(得分:0)

您需要开发类似于此的基于Java的UDF: 一旦开发完成,您需要编译以将其运送到集群,添加jar文件并创建临时函数。

import java.text.ParseException;
import java.text.SimpleDateFormat;

import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;

public class DateTranslate extends UDF {
    public String evaluate(Text str) {
        SimpleDateFormat formatter = new SimpleDateFormat("<SOURCE_DATE_FORMAT>");
        String transactionDate = null;
        try {
            transactionDate = (new SimpleDateFormat("yyyy-MM-dd") //2013-01-03
                    .format(formatter.parse(str.toString())))
                    .toString();
        } catch (ParseException e) {
            e.printStackTrace();
        }

        return transactionDate;

    }

}

答案 2 :(得分:0)

创建自定义UDF:

package org.apache.hadoop.hive.contrib.dateparser;

import java.text.ParseException;
import java.text.SimpleDateFormat;

import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;

public class dateparserHive extends UDF {
    public String evaluate(Text str) {
        SimpleDateFormat formatter = new SimpleDateFormat("EEE MMM dd HH:mm:ss ZZZZZ yyyy");
        String twitterDate = null;
        try {
            twitterDate = (new SimpleDateFormat("yyyy-MM-dd")
                    .format(formatter.parse(str.toString())))
                    .toString();
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return twitterDate;

    }

}

步骤1:创建一个jar文件。将此jar文件复制到本地文件系统

第2步:打开Hive终端:

第3步:添加JAR /home/oxigen/dateparser.jar;

步骤4:创建临时函数dateparsertwitter为'org.apache.hadoop.hive.contrib.dateparser.dateparserHive';

步骤5:从twitter限制1中选择dateparsertwitter('Wed Mar 02 09:56:41 +0000 2016');

这应该可以正常工作!