impala中时间字段采用int96保存,常规时间如:2017-05-23 11:59:43.345717要保存为timestamp类型,则需要经过转换才能使用。采用Julian day来格式化时间,利用JdateTime生成nanotime然后转换为Binary保存到hdfs.NanoTimeUtils根据JdateTime生成nanotime
注意时区:不同时区生成的结果不同
/**
* 创建日期:2017-8-4
* 包路径:org.meter.parquet.NanoTimeUtils.java
* 创建者:meter
* 描述:
* 版权:copyright@2017 by meter !
*/
package org.meter.parquet;
import java.sql.Timestamp;
import java.util.Calendar;
import java.util.TimeZone;
import org.apache.parquet.example.data.simple.NanoTime;
import jodd.datetime.JDateTime;
/**
* @author meter
* 文件名:NanoTimeUtils
* @描述:NanoTime工具,用于保存parquet文件timestamp类型字段
*/
public class NanoTimeUtils {
static final long NANOS_PER_SECOND = 1000000000;
static final long SECONDS_PER_MINUTE = 60;
static final long MINUTES_PER_HOUR = 60;
private static final ThreadLocal<Calendar> parquetTsCalendar = new ThreadLocal<Calendar>();
private static Calendar getCalendar() {
// Calendar.getInstance calculates the current-time needlessly, so cache
// an instance.
if (parquetTsCalendar.get() == null) {
parquetTsCalendar.set(Calendar.getInstance(TimeZone
.getTimeZone("Asia/Shanghai")));
}
return parquetTsCalendar.get();
}
public static NanoTime getNanoTime(Timestamp ts) {
Calendar calendar = getCalendar();
calendar.setTime(ts);
JDateTime jDateTime = new JDateTime(calendar.get(Calendar.YEAR),
calendar.get(Calendar.MONTH) + 1, // java calendar index
// starting at 1