在配置单元中转换日期格式

gpnt7bae  于 2021-06-02  发布在  Hadoop
关注(0)|答案(3)|浏览(401)

我已经下载了hdfs中的twitter数据,并成功地在上面创建了hive表。twitter在json文件中给出了日期格式“thu-dec 10 06:21:00+0000-2015”,我想将此格式转换为“yyy-mm-dd”,我尝试了hive提供的内置函数,但它们不接受twitter提供的格式。有人能帮我转换一下格式吗。

2o7dmzc5

2o7dmzc51#

您需要开发与此类似的基于java的udf:一旦开发完成,就需要编译jar并将其发送到集群,添加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;

    }

}
g6ll5ycj

g6ll5ycj2#

也许一个自定义项是过度的,你想要的只是一个快速的解决方案,例如一些不好的格式的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
llew8vvj

llew8vvj3#

创建自定义自定义项:

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文件
第二步:打开Hive终端:
第三步:添加jar/home/oxigen/dateparser.jar;
第4步:创建临时函数dateparsertwitter为'org.apache.hadoop.hive.contrib.dateparser.dateparserhive';
第五步:从twitter limit 1中选择dateparsertwitter('wed mar 02 09:56:41+0000 2016');
这应该很管用!

相关问题