這些天在給公司裏作mcq,hbase版本升級的測試,要求數量千萬級的mcq,hbase讀寫。 java
由於數據太大,中間須要保存json格式的文件,本身紗布呵呵地使用了FileWriter而後數據錯誤地一塌糊塗。 json
在各位須要保存json到文本時候,千萬注意別用String形式保存,會有不少麻煩。我的使用的最後方案是 測試
net.sf.json包+FileInputStream,代碼以下: 編碼
private static String protoToJson(List<Column> rowkey, List<Column> values, int tableId) { JSONObject json=new JSONObject(); json.accumulate("type", "mutation"); JSONArray mutations=new JSONArray(); JSONObject mutation=new JSONObject(); mutation.accumulate("kind", "PUT"); mutation.accumulate("table_id", tableId); mutation.accumulate("timestamp", 1445221080071L); JSONArray keys=new JSONArray(); JSONArray value=new JSONArray(); // 處理rowkey for (int i = 0; i < rowkey.size(); i++) { ColumnProto cp=rowkey.get(i).toProto(); JSONObject onekey=new JSONObject(); onekey.accumulate("column_id", cp.getColumnId()); switch(rowkey.get(i).getColumnType().getNumber()){ case 1: onekey.accumulate("int_value", cp.getIntValue()); break; case 3: onekey.accumulate("double_value", cp.getDoubleValue()); break; case 4: onekey.accumulate("string_value", cp.getBytesValue().toStringUtf8()); break; } keys.add(onekey); } mutation.accumulate("keys", keys); // 處理value for (int j = 0; j < values.size(); j++) { ColumnProto cp=values.get(j).toProto(); JSONObject onevalue=new JSONObject(); onevalue.accumulate("column_id", cp.getColumnId()); switch(values.get(j).getColumnType().getNumber()){ case 1: onevalue.accumulate("int_value", cp.getIntValue()); break; case 3: onevalue.accumulate("double_value", cp.getDoubleValue()); break; case 4: onevalue.accumulate("string_value", cp.getBytesValue().toStringUtf8()); break; } value.add(onevalue); } mutation.accumulate("value", value); mutations.add(mutation); json.accumulate("mutations", mutations); return json.toString(); }
private static void toWrite(String path, String content) { File f = new File(path); try { if (!f.exists()) { f.createNewFile(); } FileOutputStream fw = new FileOutputStream(f, true); fw.write(content.getBytes()); fw.write("\n".getBytes()); fw.close(); } catch (Exception e) { e.printStackTrace(); } }
白癡地測試過程。。。 spa
-------------------------------------------------------------------------------------------------- code
測試過程是讀取hbase數據解析爲json再插入新的hbase,再將新hbase數據掃出解析爲json,最終數據對比。中間的數據格式都是json。因爲數據量太大不得不把json格式的數據保存到本地文件。可是hbase存儲的是json解析後按照column拆分的數據,並且公司通信過程當中對部分數據使用了protobuf序列化了數據,使得從hbase掃出的數據比較混亂,生成json也比較複雜。 字符串
這時候出現了一個白癡的場景,爲了拼接json更快捷,我自做聰明地本身寫了一個json的字符串拼接,而後用FIleWriter寫入文件。結果很悲劇:json數據中存在各類特殊字符
get
1.引號轉譯 string
2.反斜槓轉譯 it
3.換行符轉譯
4.特殊字符(韓文,日文等)
這些字符在使用String類型進行Writer時候會出現因爲系統編碼與內容編碼不一致致使許多字符丟失!其中最明顯的就是韓文的丟失。