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),
因此,為了避免不必要的麻煩(當然,如果你僅僅需要一個數據,或是整個group都需要,當我沒說),通過Thrift序列化的資料,可以通過ThriftParquetReader進行反序列化讀取,直接將內容讀取至對應的class中。方法如下:
其中,Class T需要實現的介面為TBase<?,?>,當然,由於你使用的是serialization.class,所以預設不需要考慮這個問題,通過read後,你就可以愉快的通過T中的各種方法獲取對應欄位而不用擔心再拋異常啦~ 讀取到末尾時,read()會返回一個null,並且在用完之後,記得把它close掉哦,還有,ThriftParquetReader在package parquet.thrift和org.apache.parquet.thrift中都有,此處我們需要的是後者,不要導錯包哦~ParquetReader<T> parquetReader = ThriftParquetReader .<T> build(filePath) .withThriftClass(<ClassT>) .build(); T objectT = parquetReader.read();
相關推薦
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
75、JSON與對象的序列化與反序列化
-i ack tco inline order eight .com blog 技術分享 75、JSON與對象的序列化與反序列化
FastJson 陣列、List、Set、Map基本序列化與日期格式化
摘要: FastJson可以直接序列化陣列、List、Set、Map等,也可以直接支援日期型別資料的格式化,包括java.util.Date、java.sql.Date、java.sql.Timestamp、java.sql.Time。 FastJson不僅可以支援普通
FastJson 數組、List、Set、Map基本序列化與日期格式化
混合 sta 日期類 hang EDA time json2 fas nta 摘要: FastJson可以直接序列化數組、List、Set、Map等,也可以直接支持日期類型數據的格式化,包括java.util.Date、java.sql.Date、java.sql.Time
Java IO: 序列化與ObjectInputStream、ObjectOutputStream
作者:Jakob Jenkov 譯者: 李璟([email protected]) 本小節會簡要概括Java IO中的序列化以及涉及到的流,主要包括ObjectInputStream和ObjectOutputStream。 Serializable 原文連結 如果你希望類能夠序列化
java(三)物件的序列化與static、final關鍵字
Java序列化是指把Java物件轉換為位元組序列的過程;而Java反序列化是指把位元組序列恢復為Java物件的過程。java中存有Cloneable介面,實現此介面的類都具有被拷貝能力,比new一個物件
Properties類、序列化流與反序列化流
Properties類 Properties類介紹 特點: 1、Hashtable的子類,map集合中的方法都可以用。 2、該集合沒有泛型。鍵值都是字串。 3、它是一個可以持久化的屬性集。鍵值可以儲存到集合中,也可以儲存到持久化的裝置(硬碟、U盤、光碟)上。鍵值的來源也可以是持久化的裝置。 4、有和流
實現 序列化引擎(支援 JDK預設、Hessian、Json、Protostuff、Xml、Avro、ProtocolBuffer、Thrift等序列化方式)
本文將實現一個包含JDK預設、Hessian、Json、Protostuff、Xml、Avro、ProtocolBuffer、Thrift等序列化方式的序列化引擎。使用者可以提供使用 SerializerEngine 方便快捷地切換序列化方法實現。 文章目錄
Kryo、msgpack、protobuf、Hessian、Avro、Thrift等序列化框架比較
最近一直在想如果讓我自己來做一個服務化框架出來,該實現些什麼功能,具體該怎麼去做這樣的問題,資料序列化是一個重要的模組,故此有意對常見的一些開源序列化框架做一個比較! 我個人對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