2015-12-10 37 views
0

我已經下載了hdfs中的twitter數據,並且已經成功地在其上創建了配置單元表。 Twitter在json文件中給出了日期格式'Thu Dec 10 06:21:00 +0000 2015',並且我想將此格式轉換爲'yyy-MM-dd'我已經嘗試過內置由蜂巢提供的函數,但它們不是接受twitter提供的格式。任何人都可以幫助我轉換這種格式。Hive中的隱藏日期格式

回答

0

您需要開發基於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; 

    } 

} 
0

也許一個UDF是矯枉過正,你想要的只是一個快速修復,例如,那個醜陋格式的一些正則表達式按摩(警告:這是你的工作,對各類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 
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:打開蜂房終端:

步驟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');

這應該很好!