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