最近發現了一個很好用的工具streamsets工具。我將oracle數據庫當中的數據增量的導入到hive當中。導入是按照唯一的主鍵ID將數據導入進來。
出現的問題如下:
(1)數據精度的問題:
因為表是提前創建好的,我將id字段定義為int類型,但是在oracle數據庫當中的數據類型是number類型。然后將number類型的數據轉換為decimal類型的數據。decimal默認的精度為(1,38)位。所以這里的解決辦法就是
在oracle導入數據和hive的元數據之間加上一個數據類型轉化的操作。將原來的number類型轉化為integer類型。這樣在hive表當中定義的數據類型就不會出現數據類型轉化異常的問題
(2)hive當中的表的存儲格式不一致:
com.streamsets.pipeline.api.base.OnRecordErrorException: HIVE_32 - Table test_to_hive is created using Storage Format Type org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe, but Avro requested instead at com.streamsets.pipeline.stage.processor.hive.HiveMetadataProcessor.process(HiveMetadataProcessor.java:585) at com.streamsets.pipeline.api.base.RecordProcessor.process(RecordProcessor.java:52) at com.streamsets.pipeline.api.base.configurablestage.DProcessor.process(DProcessor.java:35) at com.streamsets.datacollector.runner.StageRuntime.lambda$execute$2(StageRuntime.java:286) at com.streamsets.datacollector.runner.StageRuntime.execute(StageRuntime.java:235) at com.streamsets.datacollector.runner.StageRuntime.execute(StageRuntime.java:298) at com.streamsets.datacollector.runner.StagePipe.process(StagePipe.java:244) at com.streamsets.datacollector.execution.runner.common.ProductionPipelineRunner.processPipe(ProductionPipelineRunner.java:824) at com.streamsets.datacollector.execution.runner.common.ProductionPipelineRunner.lambda$executeRunner$3(ProductionPipelineRunner.java:869) at com.streamsets.datacollector.runner.PipeRunner.executeBatch(PipeRunner.java:136) at
從這報錯可以看出hive表當中的數據類型呀定義為AVRO的數據類型。
(3)在增量導入數據的時候出現,形成的文件一直是tmp開頭的文件。所以在hive的客戶端查詢不到數據效果如下:
突然發現只有每次吧pipline關閉掉才能讀取hive上面的文件。最后在hive的設置當中找到相關的選項:
這兩個選項的目的就是為了限制輸出的文件的大小,和控制多長時間輸出一個文件。我們會發現,當我們設置了時間之后,優先按照時間對數據進行輸出形成的文件不在是tmp類型的文件。
還有就是文件大小,如果我們設置的時間夠長,在一定的時間內形成了10M這樣的文件就輸出,不在考慮時間的限制。
總結:這個其實和flume的原理是相同的對數據進行回滾操作。然后按照時間或者文件大小的方式對形成的數據文件進行大小的限制。