1. 程式人生 > >impala儲存時間型別timestamp---NanoTimeUtils根據JdateTime生成nanotime

impala儲存時間型別timestamp---NanoTimeUtils根據JdateTime生成nanotime

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
 * 描述:
 * 版權:[email protected]
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. calendar.get(Calendar.DAY_OF_MONTH)); int days = jDateTime.getJulianDayNumber(); long hour = calendar.get(Calendar.HOUR_OF_DAY); long minute = calendar.get(Calendar.MINUTE); long second = calendar.get(Calendar.SECOND); long nanos = ts.getNanos(); long nanosOfDay = nanos + NANOS_PER_SECOND * second + NANOS_PER_SECOND * SECONDS_PER_MINUTE * minute + NANOS_PER_SECOND * SECONDS_PER_MINUTE * MINUTES_PER_HOUR * hour; return new NanoTime(days, nanosOfDay); } public static NanoTime getNanoTime(String time){ Timestamp ts=Timestamp.valueOf(time); 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. calendar.get(Calendar.DAY_OF_MONTH)); int days = jDateTime.getJulianDayNumber(); long hour = calendar.get(Calendar.HOUR_OF_DAY); long minute = calendar.get(Calendar.MINUTE); long second = calendar.get(Calendar.SECOND); long nanos = ts.getNanos(); long nanosOfDay = nanos + NANOS_PER_SECOND * second + NANOS_PER_SECOND * SECONDS_PER_MINUTE * minute + NANOS_PER_SECOND * SECONDS_PER_MINUTE * MINUTES_PER_HOUR * hour; return new NanoTime(days, nanosOfDay); } public static Timestamp getTimestamp(NanoTime nt) { int julianDay = nt.getJulianDay(); long nanosOfDay = nt.getTimeOfDayNanos(); JDateTime jDateTime = new JDateTime((double) julianDay); Calendar calendar = getCalendar(); calendar.set(Calendar.YEAR, jDateTime.getYear()); calendar.set(Calendar.MONTH, jDateTime.getMonth() - 1); // java calender // index // starting at // 1. calendar.set(Calendar.DAY_OF_MONTH, jDateTime.getDay()); long remainder = nanosOfDay; int hour = (int) (remainder / (NANOS_PER_SECOND * SECONDS_PER_MINUTE * MINUTES_PER_HOUR)); remainder = remainder % (NANOS_PER_SECOND * SECONDS_PER_MINUTE * MINUTES_PER_HOUR); int minutes = (int) (remainder / (NANOS_PER_SECOND * SECONDS_PER_MINUTE)); remainder = remainder % (NANOS_PER_SECOND * SECONDS_PER_MINUTE); int seconds = (int) (remainder / (NANOS_PER_SECOND)); long nanos = remainder % NANOS_PER_SECOND; calendar.set(Calendar.HOUR_OF_DAY, hour); calendar.set(Calendar.MINUTE, minutes); calendar.set(Calendar.SECOND, seconds); Timestamp ts = new Timestamp(calendar.getTimeInMillis()); ts.setNanos((int) nanos); return ts; } public static void main(String[] args) { getNanoTime("2017-05-23 11:59:43.345717"); } }
測試類:寫parquet格式檔案,用於impala操作timestamp欄位access_time;impala中timestamp欄位型別儲存為int96
/**
 * 建立日期:2017-8-3
 * 包路徑:org.meter.parquet.ParquetWriteTimeStampDemo.java
 * 建立者:meter
 * 描述:
 * 版權:[email protected] by meter !
 */
package org.meter.parquet;

import java.io.IOException;
import jodd.datetime.JDateTime;
import org.apache.hadoop.fs.Path;
import org.apache.parquet.column.ParquetProperties;
import org.apache.parquet.example.data.Group;
import org.apache.parquet.example.data.simple.SimpleGroupFactory;
import org.apache.parquet.hadoop.ParquetFileWriter;
import org.apache.parquet.hadoop.ParquetWriter;
import org.apache.parquet.hadoop.example.ExampleParquetWriter;
import org.apache.parquet.hadoop.metadata.CompressionCodecName;
import org.apache.parquet.schema.MessageType;
import org.apache.parquet.schema.MessageTypeParser;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @author meter
 * 檔名:ParquetWriteTimeStampDemo
 * @描述:
 */
public class ParquetWriteTimeStampDemo {

	private static Logger logger = LoggerFactory
			.getLogger(ParquetWriteTimeStampDemo.class);
	private static String schemaStr = "message schema {"
			+ "optional int64 log_id;" + "optional binary idc_id;"
			+ "optional int64 house_id;" + "optional int64 src_ip_long;"
			+ "optional int64 dest_ip_long;" + "optional int64 src_port;"
			+ "optional int64 dest_port;" + "optional int32 protocol_type;"
			+ "optional binary url64;" + "optional int96 access_time;}";
	private static MessageType schema = MessageTypeParser
			.parseMessageType(schemaStr);
	private static SimpleGroupFactory groupFactory = new SimpleGroupFactory(
			schema);

	/**
	 * 建立時間:2017-8-3
	 * 建立者:meter
	 * 返回值型別:ParquetWriter
	 * @描述:初始化writer
	 * @param path
	 * @return
	 * @throws IOException
	 */
	private static ParquetWriter<Group> initWriter(String path) throws IOException {
		Path file = new Path("file:///"+path);
		ExampleParquetWriter.Builder builder = ExampleParquetWriter
				.builder(file).withWriteMode(ParquetFileWriter.Mode.CREATE)
				.withWriterVersion(ParquetProperties.WriterVersion.PARQUET_1_0)
				.withCompressionCodec(CompressionCodecName.SNAPPY)
				// .withConf(configuration)
				.withType(schema);
		/*
		 * file, new GroupWriteSupport(), CompressionCodecName.SNAPPY, 256 *
		 * 1024 * 1024, 1 * 1024 * 1024, 512, true, false,
		 * ParquetProperties.WriterVersion.PARQUET_1_0, conf
		 */
		return builder.build();
	}

	
	/**
	 * 建立時間:2017-8-3 建立者:meter 返回值型別:void
	 * 
	 * @描述:
	 * @param args
	 * @throws IOException 
	 */
	public static void main(String[] args) throws IOException {
		ParquetWriter<Group> writer = initWriter("C:\\Users\\meir\\Desktop\\linuxtetdir\\logtxt\\testTime0804.parq");
		String[] access_log = { "111111", "22222", "33333", "44444", "55555",
				"666666", "777777", "888888", "999999", "2017-05-23 11:59:43.345717" };
		JDateTime time=new JDateTime("2017-05-23 11:59:43.345717");
		int day=time.getDay();
		
		for(int i=0;i<1000;i++){
		writer.write(groupFactory.newGroup()
				.append("log_id", Long.parseLong(access_log[0]))
				.append("idc_id", access_log[1])
				.append("house_id", Long.parseLong(access_log[2]))
				.append("src_ip_long", Long.parseLong(access_log[3]))
				.append("dest_ip_long", Long.parseLong(access_log[4]))
				.append("src_port", Long.parseLong(access_log[5]))
				.append("dest_port", Long.parseLong(access_log[6]))
				.append("protocol_type", Integer.parseInt(access_log[7]))
				.append("url64", access_log[8])
				.append("access_time", NanoTimeUtils.getNanoTime(access_log[9]).toBinary()));
		}
		writer.close();
	}

}



相關推薦

impala儲存時間型別timestamp---NanoTimeUtils根據JdateTime生成nanotime

impala中時間欄位採用int96儲存,常規時間如:2017-05-23 11:59:43.345717要儲存為timestamp型別,則需要經過轉換才能使用。採用Julian day來格式化時間,利用JdateTime生成nanotime然後轉換為Binary儲存到hd

mysql時間型別timestamp知識點

mysql日期時間型別 日期型別 位元組 最小值 最大值 DATE 4 1000-01-01 9999-12-31 DATETIME 8 1000-01-01 00:00:00 TimeS

java中儲存mysql資料庫時間型別【date、time、datetime、timestamp

在mysql中對於時間的儲存自己見表的時候都是設定的varchar型別的,感覺挺方便的。 昨天拿別人建好的表寫程式碼,發現這張表中時間型別為datetime的,憑感覺試了一下不行,網上查了剛開始試了好幾個都是不對的,一臉懵逼。 -----------------------

時間型別:datetime,timestamp,date,time,year

時間型別 1、年月日時分秒:datetime #取值範圍# '1000-01-01 00:00:00'到'9999-12-31 23:59:59' 佔儲存8B;表示的範圍比timestamp大;支援0值,表示當前是沒有規定,例如2013-04-0表示4月整個月(邏輯想法)。 #YYYY-MM-DD HH

【小家SQL】MySql資料型別---日期時間型別的使用(含datetime和timestamp的區別)

每篇一句 練武不練功,到老一場空。 程式設計師應該注重內功的修煉,那才是核心競爭力 說在前面 在這一路學習過來,每次不管看書還是網上看的資料,對於MySQL資料型別中的時間日期型別總是一掃而過,不曾停下來認認真真的研究學習。最近看了一本關於MySql的書

MySQL中時間型別DATETIME、TIMESTAMP、DATE、TIME、YEAR

1.幾個的區別 詳細可以參考:https://www.cnblogs.com/Jie-Jack/p/3793304.html 2.針對時間型別的一些操作 nodejs支援多種格式轉換為時間戳: var str1 = "2017-01-19 13:00:00"; va

Java獲取系統時間日期儲存到資料庫Timestamp時間限制

由於Java中沒有datetime資料型別,timestamp型別資料在資料庫中只能儲存到2038年,資料庫中存完整的時間日期可以使用datetime。本文主要探索在Java中使用Timestamp型別時間插入到資料庫欄位型別為datetime的可行性。關於Java中util和sql時間日期的資

mysql(自動新增系統時間timestamp型別欄位的CURRENT_TIMESTAMP與ON UPDATE CURRENT_TIMESTAMP屬性

timestamp有兩個屬性,分別是CURRENT_TIMESTAMP 和ON UPDATE CURRENT_TIMESTAMP兩種,使用情況分別如下: 1.CURRENT_TIMESTAMP  當要向資料庫執行insert操作時,如果有個timestamp欄位屬性設為 

Mysql儲存日期型別用int、datetime還是timestamp?

常儲存時間用datetime型別,現在很多系統也用int儲存時間,它們有什麼區別?1)int  (1) 4個位元組儲存,INT的長度是4個位元組,儲存空間上比datatime少,int索引儲存空間也相對較小,排序和查詢效率相對較高一點點(2)可讀性極差,無法直觀的看到資料,可

根據年月日查詢mysql的時間戳(timestamp)的處理方法

有的時候我們想查詢資料的建立時間,也可以理解為使用者的註冊時間來查詢資料,因為一般建立時間都會timestamp型別,所以根據年月日的日期是無法查詢到的,所以我們需要轉換格式查詢,下面就看具體的操作吧。這是我表的資料。這是我的查詢語句。完全查詢不到的。下面我們就要根據時間戳來

mysql timestamp和long儲存時間效率比較

show create table 20130107date; CREATE TABLE `20130107date` ( `id` int(11) NOT NULL AUTO_INCREMENT

MySQL中的時間型別轉換timestamp

Unixtime與字串date時間的轉換  select unix_timestamp() 是將字串date的時間型別轉化成長整型 select from_unixtime(1355272360); 將timestamp 形式整數 轉化為 date型別 select

10_時間timeStamp時間 time 轉換, 根據時間節點倒計時

1: 時間戳 timeStamp 獲取的幾種方法及其優劣, 第一種只能精確到秒, 故不推薦使用, 最最常用的也是最官方的是第三種, 通過原型方法進行呼叫獲取精確到毫秒數 :  var timestamp1 = Date.parse(new Date()); // 結果:147780863000

oracle 時間TIMESTAMP

table pre varchar trac ace pri oracl string private //數據庫 UPDATETIMESTAMP TIMESTAMP(6) //dto /** 更新時間戳 **/ private String updatetimes

計算機基礎 - 時間戳(timestamp)位數

AS () source digi tee mes span unix import 分為10位數字(ten digit)和13位(thirteen digit)數字 1. Unix, Python為10 time +%s import time time.time() 2

mysql的時間timestamp精確到小數點後六位

bsp 秒級 pan 圖片 行數據 .com png sta style 1、mysql的時間戳timestamp精確到小數點後六位。 公司業務使用到Greenplun數據庫,根據查詢的時間戳來不斷的將每個時間段之間的數據,進行數據交換,但是今天發現,mysql的時間戳沒

logstash-使用日誌的生成時間戳替換日誌收集時間戳@timestamp

預設情況下ELK收集到的日誌在kibana上展示出來的時間戳和日誌的生成時間是不一致的,或許很多朋友來說和日誌生成的時間相差無幾, 那我只能說,你的日誌系統可能資源比較充足,處理的比較及時,所以你看到的日誌收集時間戳和日誌產生時間戳是相差無幾的效果, 但如果是想匯入歷史日誌資料進行相應的分析,這個時候

ORACLE時間型別欄位加減簡便運算

例子: 以下“(9)”這塊無需替換,可以根據需要替換“1”或者“ ‘2’ ”即可。 -- 年份運算(當前時間-2年) SELECT SYSDATE - (1 * INTERVAL '2' YEAR(9)) AS YEAR_OPERATION FROM DUAL;

MySQL - 日期時間型別與格式化

【1】MySQL中的日期時間型別 MySQL中常用的幾種時間型別有:date、datetime、time、year、timestamp; ① 詳細解釋 Datetime : 時間日期型,格式是YYYY-mm-dd HH:ii:ss,表示的範圍是從1000到9999。但是有零值,0000-

微信公眾平臺工具 —— DateTime轉為微信所需要的時間型別

/// <summary> /// datetime轉換為unixtime /// </summary> /// <param name="time">要轉換的時間</param> /// <returns></returns>