1. 是否存在高效的csv導出工具?
phoenix提供了BulkLoad工具,使得用戶可以將大數據量的csv格式數據高效地通過phoenix導入hbase,那么phoenix是否也存在高效導出csv數據的工具類呢?
這里可能有人會想是否能夠按照導出常規hbase的方法來導出數據。比如自己寫Java代碼,或者用hbase原生支持的工具類,或者說采用pig提供的hbase工具類。是否能這么干取決於你phoenix建表時候字段的數據類型。如果字段采用的不是varchar、char等字符類型以及unsigned_*類型,或者你的表是salted table,那么脫離phoenix的導出方式必然會導致導出的數據不正確。原因在於phoenix處理大部分數據類型數據字節格式化的方式與原生hbase不一樣。比如,phoenix salted table會在rowkey的第一個字節插入hash值來使數據均勻分布到每一個region上,所以用常規hbase導出工具導出勢必造成rowkey的導出不正確。
2. Pig Loader——最優且唯一的Phoenix導出csv文件工具
幸運的是phoenix官方確實提供了一個高效的導出工具類,但是必須依賴於pig。而且在試驗過程,也就發現只有這個唯一的工具可以完美地支持phoenix表數據的導出。
關於pig的介紹以及使用不是這篇文章的重點,沒有接觸過的朋友請自行百度或者google檢索。
phoenix集成pig的介紹可以在下面的官網鏈接查看:
https://phoenix.apache.org/pig_integration.html
里面提到了兩個工具方法,一個用於海量數據的導入,類似於BulkLoad工具,另外一個工具方法用於海量數據的導出。這里我們關注數據的導出。
導出工具號稱為 Pig Loader。根據官網上的介紹:
A Pig data loader allows users to read data from Phoenix backed HBase tables within a Pig script.
意思是我們可以編寫pig腳本並使用phoenix-pig(phoenix繼承pig的模塊)提供的工具類來運行pig腳本實現海量數據的導出。
Pig Loader有兩種形式實現導出:
2.1 export using table
第一種是通過指定hbase表名來導出整個表數據,例如我想導出TEST表的所有記錄,那么可以用如下的腳本命令:
A = load ‘hbase://table/USER‘ using org.apache.phoenix.pig.PhoenixHBaseLoader(‘${zookeeper.quorum}‘);
需要將${zookeeper.quorum}替換成zookeeper集群機器ip加端口,eg: master,slave1,slave2:2181
當然我們還可以精確控制只導出表的哪幾個列:
A = load ‘hbase://table/USER/ID,NAME‘ using org.apache.phoenix.pig.PhoenixHBaseLoader(‘${zookeeper.quorum}‘);
上面的腳本表示導出TEST表所有記錄,但僅包含ID列和NAME列。
2.2 export using query
另外一種是通過指定query語句來控制導出的數據:
A = load ‘hbase://query/SELECT ID,NAME FROM USER WHERE AGE > 50‘ using org.apache.phoenix.pig.PhoenixHBaseLoader(‘${zookeeper.quorum}‘);
【注意】
使用query語句指定的導出方式存在很大的限制,比如說不能指定GROUP BY , LIMIT , ORDER BY , DISTINCT ;同時也無法指定使用聚合函數,如count,sum等。
3. 使用示例
下面我們通過兩個完整的使用示例介紹兩種導出方式的使用。Example1演示指定table方式的導出,而Example2演示指定query方式的導出。
3.1 Example1
vi example1.pig
REGISTER /data/phoenix-default/phoenix-4.6.0-HBase-1.0-client.jar; rows = load ‘hbase://table/USER‘ USING org.apache.phoenix.pig.PhoenixHBaseLoader(‘master,slave1,slave2:2181‘); STORE rows INTO ‘USER.csv‘ USING PigStorage(‘,‘);
執行shell命令:
pig -x mapreduce example1.pig
3.2 Example2
vi example2.pig
REGISTER /data/phoenix-default/phoenix-4.6.0-HBase-1.0-client.jar; rows = load ‘hbase://query/SELECT ID,NAME FROM USER‘ USING org.apache.phoenix.pig.PhoenixHBaseLoader(‘master,slave1,slave2:2181‘); STORE rows INTO ‘USER.csv‘ USING PigStorage(‘,‘);
執行shell命令:
pig -x mapreduce example2.pig
標簽:
原文地址:http://blog.csdn.net/d6619309/article/details/51339217