2013-10-07 47 views
0

我與處理的各種基於基礎數據集的方式節儉參賽對象一個工作SERDE不再偷懶。它本質上是一個榮耀的Hive Struct,它在運行時處理基本數據集,而不是將結果存儲在表中。最近,我已經升級從蜂巢0.7.1羣集蜂巢0.10.0(與CDH3 - > CDH4.3.0)和SERDE不再懶惰地處理該數據,而是似乎處理中定義的每個單個字段。蜂巢定製懶節儉SERDE是CDH4

我已經挖掘了Hive的代碼,並且瞭解了我們的數據是如何反序列化的,以便了解它是如何確定它想要處理的字段的,但不幸的是,它好像正在處理所有列,僅僅是因爲我們ObjectInspector返回我們自定義對象的所有字段,我似乎無法弄清楚如何控制正在處理的字段。

我可以操縱哪些部分蜂巢的改變正在處理哪些領域?有沒有一種方法可以檢測查詢中使用的字段,以便禁用對象內部狀態中的函數?

編輯:我意識到,這會是有用的,包括一個堆棧跟蹤,以顯示其中特定函數來處理該數據正在被呼叫,由於它是一個檢查場。

我替換描述性名稱自定義類名字的角色,而不是。

2013-10-08 17:02:45,198 INFO CustomStructFunction: Stack trace: java.lang.Throwable 
    at CustomStructFunction.init(CustomStructFunction.java:490) 
    at CustomStructFunctionBase.process(CustomStructFunctionBase.java:27) 
    at CustomStructObject.callImplementor(CustomStructObject.java:332) 
    at CustomStructField.callImplementor(CustomStructField.java:161) 
    at CustomStructField.getValue(CustomStructField.java:131) 
    at CustomStructObjectInspector.getStructFieldData(CustomStructObjectInspector.java:46) 
    at org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorConverters$StructConverter.convert(ObjectInspectorConverters.java:298) 
    at org.apache.hadoop.hive.ql.exec.MapOperator.process(MapOperator.java:630) 
    at org.apache.hadoop.hive.ql.exec.ExecMapper.map(ExecMapper.java:141) 
    at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:50) 
    at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:417) 
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:332) 
    at org.apache.hadoop.mapred.Child$4.run(Child.java:268) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at javax.security.auth.Subject.doAs(Subject.java:396) 
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1408) 
    at org.apache.hadoop.mapred.Child.main(Child.java:262) 

回答

0

事實證明,我們的自定義對象每次要求它都返回一個新的ObjectInspector。這導致Hive認爲自定義結構的輸入格式與導出格式是分開的,這導致Hive將數據轉換爲基本結構對象,這基本上意味着處理每一個字段。

而是在我們的基礎自定義的結構定義每次返回一個新ObjectInspector的,我不是把它留給了擴展的類定義開始爲空靜態ObjectInspector。父類然後調用方法「getInnerObjectInspector」,如果它爲null,它使用類似的set方法和新的實例來設置它。