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>