1. 程式人生 > >thrift、序列化與parquet讀取

thrift、序列化與parquet讀取

parquet是一種常見的列式儲存格式,普通的parquet檔案可以用java中的ParquetReader<Group>來讀取,在儲存格式較為簡單時,可以通過Group.get×××可以獲得相應列的資料,獲得相應json格式資料(手動拼接)的程式碼如下:

// 獲取欄位資訊
				ParquetMetadata readFooter = ParquetFileReader.readFooter(
						fs.getConf(), filePath,
						ParquetMetadataConverter.NO_FILTER);
				MessageType schema = readFooter.getFileMetaData().getSchema();
				List<Type> colTypes = schema.getFields();

				ParquetReader<Group> reader = ParquetReader
						.builder(new GroupReadSupport(), filePath)
						.withConf(fs.getConf()).build();
				Group recordData = reader.read();

				// 先拼成json格式
				while (recordData != null) {
					StringBuilder builder = new StringBuilder();
					builder.append("{");
					for (int j = 0; j < colTypes.size(); j++) {
						// 獲得欄位名和值
						String columnName = colTypes.get(j).getName();
						String value = recordData.getValueToString(j, 0);
						builder.append("\"" + columnName + "\":\"" + value
								+ "\"");
						builder.append(j == colTypes.size() - 1 ? "}" : ",");
					}

					buffers.add(builder.toString());
					recordData = reader.read();
				}

但當檔案通過Thrift進行序列化(自定義的serialization.class)後,直接Group.toString()檢視獲取到的整個欄位內容,發現它為如下格式:

root1

key1:val1

key2

subkey1:subval1

key3

root2

root3

...

這種格式依然可以通過group讀取,但在一些特定欄位不存在時,get方法會丟擲異常,並且程式碼看起來非常凌亂,上文的資料樣例,如果想要獲取subval1的值,假設欄位型別為String,則需要group.getGroup("root1",0).getGroup("key2",0).getString("subkey1",0),

這樣的方式,其中,get方法的第二個引數為第k個名稱為var的資料,同時,還需要catch住因為中間欄位不存在的情況而丟擲的異常。

因此,為了避免不必要的麻煩(當然,如果你僅僅需要一個數據,或是整個group都需要,當我沒說),通過Thrift序列化的資料,可以通過ThriftParquetReader進行反序列化讀取,直接將內容讀取至對應的class中。方法如下:

ParquetReader<T> parquetReader = ThriftParquetReader
										.<T> build(filePath)
										.withThriftClass(<ClassT>)
										.build();
								T objectT = parquetReader.read();
其中,Class T需要實現的介面為TBase<?,?>,當然,由於你使用的是serialization.class,所以預設不需要考慮這個問題,通過read後,你就可以愉快的通過T中的各種方法獲取對應欄位而不用擔心再拋異常啦~ 讀取到末尾時,read()會返回一個null,並且在用完之後,記得把它close掉哦,還有,ThriftParquetReader在package parquet.thrift和org.apache.parquet.thrift中都有,此處我們需要的是後者,不要導錯包哦~

相關推薦

thrift序列parquet讀取

parquet是一種常見的列式儲存格式,普通的parquet檔案可以用java中的ParquetReader<Group>來讀取,在儲存格式較為簡單時,可以通過Group.get×××可以獲得相應列的資料,獲得相應json格式資料(手動拼接)的程式碼如下: /

Day4 閉包裝飾器decorator叠代器生成器面向過程編程三元表達式列表解析生成器表達式序列序列

反序 bsp pic nbsp tor 序列 space 列表解析 列表 http://pic.cnhubei.com/space.php?uid=1774&do=album&id=1362489http://pic.cnhubei.com/space.ph

75JSON對象的序列序列

-i ack tco inline order eight .com blog 技術分享 75、JSON與對象的序列化與反序列化

FastJson 陣列ListSetMap基本序列日期格式化

摘要: FastJson可以直接序列化陣列、List、Set、Map等,也可以直接支援日期型別資料的格式化,包括java.util.Date、java.sql.Date、java.sql.Timestamp、java.sql.Time。   FastJson不僅可以支援普通

FastJson 數組ListSetMap基本序列日期格式化

混合 sta 日期類 hang EDA time json2 fas nta 摘要: FastJson可以直接序列化數組、List、Set、Map等,也可以直接支持日期類型數據的格式化,包括java.util.Date、java.sql.Date、java.sql.Time

Java IO: 序列ObjectInputStreamObjectOutputStream

作者:Jakob Jenkov  譯者: 李璟([email protected]) 本小節會簡要概括Java IO中的序列化以及涉及到的流,主要包括ObjectInputStream和ObjectOutputStream。 Serializable 原文連結 如果你希望類能夠序列化

java(三)物件的序列staticfinal關鍵字

Java序列化是指把Java物件轉換為位元組序列的過程;而Java反序列化是指把位元組序列恢復為Java物件的過程。java中存有Cloneable介面,實現此介面的類都具有被拷貝能力,比new一個物件

Properties類序列序列

Properties類 Properties類介紹 特點: 1、Hashtable的子類,map集合中的方法都可以用。 2、該集合沒有泛型。鍵值都是字串。 3、它是一個可以持久化的屬性集。鍵值可以儲存到集合中,也可以儲存到持久化的裝置(硬碟、U盤、光碟)上。鍵值的來源也可以是持久化的裝置。 4、有和流

實現 序列引擎(支援 JDK預設HessianJsonProtostuffXmlAvroProtocolBufferThrift序列方式)

本文將實現一個包含JDK預設、Hessian、Json、Protostuff、Xml、Avro、ProtocolBuffer、Thrift等序列化方式的序列化引擎。使用者可以提供使用 SerializerEngine 方便快捷地切換序列化方法實現。 文章目錄

KryomsgpackprotobufHessianAvroThrift序列框架比較

最近一直在想如果讓我自己來做一個服務化框架出來,該實現些什麼功能,具體該怎麼去做這樣的問題,資料序列化是一個重要的模組,故此有意對常見的一些開源序列化框架做一個比較! 我個人對Hessian、Java、protobuf、Thrift這幾種序列化方式比較熟悉,但是對Kryo、

Python(檔案讀取序列序列)

借鑑菜鳥教程 一、讀取 open() 將會返回一個 file 物件,基本語法格式如下: open(filename, mode)(filename, mode) filename:包含了你要訪問的檔名稱的字串值。 mode:決定了開啟檔案的模式:只讀,寫入,追加

Java學習筆記(十三)--序列序列無參建構函式

概念序列化:將物件儲存到磁碟中,或允許在網路中直接傳輸物件,物件序列化機制允許把記憶體中的Java物件轉換成平臺無關的二進位制,從而可以持久的儲存在磁碟上,也可以在網路中傳輸。反序列化:程式一旦獲得了序

序列序列jsoncpp學習

json是序列化與反序列化的一種方式。 1. 什麼叫序列化和反序列化?用途是什麼? 把物件轉換為位元組序列的過程稱為物件的序列化。 把位元組序列恢復為物件的過程稱為物件的反序列化。 1) 把物件的位元組序列永久地儲存到硬碟上,通常存放在一

使用Newtonsoft.Json.dll(JSON.NET)動態解析JSON.net 的json的序列序列(一)

在開發中,我非常喜歡動態語言和匿名物件帶來的方便,JSON.NET具有動態序列化和反序列化任意JSON內容的能力,不必將它對映到具體的強型別物件,它可以處理不確定的型別(集合、字典、動態物件和匿名物件),在這篇文章中我將通過JToken、JObject和JArray來動態解析

Java核心類庫-IO-對象流(實現序列序列

.get throws 反序 code row cts new java cep 使用對象流來完成序列化和反序列化操作:   ObjectOutputStream:通過writeObject()方法做序列化操作的   ObjectInputStream:通過readObje

Java IO-5 序列序列

str ride log getname file urn turn objects transient 建一個Person類 1 package demo05; 2 3 import java.io.Serializable; 4 5 public cla

JAVA序列反射

技術分享 ges img .cn logs 技術 序列化 com -1 JAVA序列化與反射

契約類相關的序列序列

pub ima cti 相關 ria 數據 num spa set 契約類指繼承了:DataContract的類。契約類常在WCF,webService等各種服務中作為傳輸數據使用。 凡是契約類或者繼承了契約類的類,如果想要屬性參與序列化與反序列化,需要在屬性上加上標記:D

Python基礎(正則序列常用模塊和面向對象)-day06

.net 支持 tro sub 商城 pytho font spa 要求 寫在前面 上課第六天,打卡:     天地不仁,以萬物為芻狗; 一、正則   -   - 在線正則工具:http://tool.oschina.net/regex/   -

Python--模塊之sys模塊logging模塊序列json模塊序列pickle模塊

title 數字 spa etl 信息 none 發送 message 添加多個 sys模塊 sys.argv 命令行參數List,第一個元素是程序本身路徑 sys.exit(n) 退出程序,正常退出時exit(0) sys.path