我與處理的各種基於基礎數據集的方式節儉參賽對象一個工作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)