|
/** |
|
* Licensed to the Apache Software Foundation (ASF) under one |
|
* or more contributor license agreements. See the NOTICE file |
|
* distributed with this work for additional information |
|
* regarding copyright ownership. The ASF licenses this file |
|
* to you under the Apache License, Version 2.0 (the |
|
* "License"); you may not use this file except in compliance |
|
* with the License. You may obtain a copy of the License at |
|
* |
|
* http://www.apache.org/licenses/LICENSE-2.0 |
|
* |
|
* Unless required by applicable law or agreed to in writing, software |
|
* distributed under the License is distributed on an "AS IS" BASIS, |
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
* See the License for the specific language governing permissions and |
|
* limitations under the License. |
|
*/ |
|
|
|
package com.wakoopa.hadoop.hive.ql.udf; |
|
|
|
import java.text.SimpleDateFormat; |
|
import java.util.Calendar; |
|
import java.util.Date; |
|
|
|
import org.apache.hadoop.hive.ql.exec.Description; |
|
import org.apache.hadoop.hive.ql.exec.UDF; |
|
import org.apache.hadoop.io.IntWritable; |
|
import org.apache.hadoop.io.LongWritable; |
|
import org.apache.hadoop.io.Text; |
|
|
|
/** |
|
* UDFFromUnixTime. |
|
* |
|
*/ |
|
@Description(name = "sane_from_unixtime", |
|
value = "_FUNC_(unix_time, format) - returns unix_time in the specified format", |
|
extended = "Example:\n" |
|
+ " > SELECT _FUNC_(0, 'yyyy-MM-dd HH:mm:ss') FROM src LIMIT 1;\n" |
|
+ " '1970-01-01 00:00:00'") |
|
public class UDFSaneFromUnixTime extends UDF { |
|
private SimpleDateFormat formatter; |
|
private final Calendar calendar = Calendar.getInstance(); |
|
|
|
private Text result = new Text(); |
|
private Text lastFormat = new Text(); |
|
|
|
public UDFSaneFromUnixTime() { |
|
calendar.setFirstDayOfWeek(Calendar.MONDAY); |
|
calendar.setMinimalDaysInFirstWeek(4); |
|
} |
|
|
|
private Text defaultFormat = new Text("yyyy-MM-dd HH:mm:ss"); |
|
|
|
public Text evaluate(IntWritable unixtime) { |
|
return evaluate(unixtime, defaultFormat); |
|
} |
|
|
|
/** |
|
* Convert UnixTime to a string format. |
|
* |
|
* @param unixtime |
|
* The number of seconds from 1970-01-01 00:00:00 |
|
* @param format |
|
* See |
|
* http://java.sun.com/j2se/1.4.2/docs/api/java/text/SimpleDateFormat |
|
* .html |
|
* @return a String in the format specified. |
|
*/ |
|
public Text evaluate(LongWritable unixtime, Text format) { |
|
if (unixtime == null || format == null) { |
|
return null; |
|
} |
|
|
|
return eval(unixtime.get(), format); |
|
} |
|
|
|
/** |
|
* Convert UnixTime to a string format. |
|
* |
|
* @param unixtime |
|
* The number of seconds from 1970-01-01 00:00:00 |
|
* @return a String in default format specified. |
|
*/ |
|
public Text evaluate(LongWritable unixtime) { |
|
if (unixtime == null) { |
|
return null; |
|
} |
|
|
|
return eval(unixtime.get(), defaultFormat); |
|
} |
|
|
|
/** |
|
* Convert UnixTime to a string format. |
|
* |
|
* @param unixtime |
|
* The number of seconds from 1970-01-01 00:00:00 |
|
* @param format |
|
* See |
|
* http://java.sun.com/j2se/1.4.2/docs/api/java/text/SimpleDateFormat |
|
* .html |
|
* @return a String in the format specified. |
|
*/ |
|
public Text evaluate(IntWritable unixtime, Text format) { |
|
if (unixtime == null || format == null) { |
|
return null; |
|
} |
|
|
|
return eval(unixtime.get(), format); |
|
} |
|
|
|
/** |
|
* Internal evaluation function given the seconds from 1970-01-01 00:00:00 and |
|
* the output text format. |
|
* |
|
* @param unixtime |
|
* seconds of type long from 1970-01-01 00:00:00 |
|
* @param format |
|
* display format. See |
|
* http://java.sun.com/j2se/1.4.2/docs/api/java/text |
|
* /SimpleDateFormat.html |
|
* @return elapsed time in the given format. |
|
*/ |
|
private Text eval(long unixtime, Text format) { |
|
if (!format.equals(lastFormat)) { |
|
formatter = new SimpleDateFormat(format.toString()); |
|
formatter.setCalendar(calendar); |
|
lastFormat.set(format); |
|
} |
|
|
|
// convert seconds to milliseconds |
|
Date date = new Date(unixtime * 1000L); |
|
result.set(formatter.format(date)); |
|
return result; |
|
} |
|
} |