簡體   English   中英

Hive Custom Lazy Thrift SerDe在CDH4不再懶惰

[英]Hive Custom Lazy Thrift SerDe is no longer lazy on CDH4

我正在使用SerDe,可以根據基礎數據集以多種方式處理Thrift對象條目。 本質上,它是一種榮耀的Hive結構,它在運行時處理基本數據集,而不是將結果存儲在表中。 最近,我將群集從Hive 0.7.1升級到Hive 0.10.0(使用CDH3-> CDH4.3.0),SerDe不再懶惰地處理數據,而是似乎在處理定義的每個字段。

我已經研究了Hive的代碼,並研究了如何對數據進行反序列化,以了解其如何確定要處理的字段,但是不幸的是,似乎是因為我們的ObjectInspector返回了所有自定義對象的“字段”,我似乎無法弄清楚如何控制要處理的字段。

我可以操縱Hive的哪些部分來更改正在處理的字段? 有沒有一種方法可以檢測查詢中正在使用哪些字段以禁用對象內部狀態的功能?

編輯:我意識到包含一個堆棧跟蹤以顯示由於要檢查的字段而在其中調用處理數據的特定功能會很有用。

我將自定義類名稱替換為角色的描述性名稱。

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)

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

我沒有在我們的基本自定義結構定義中每次都返回一個新的ObjectInspector,而是將其留給擴展類來定義一個以null開頭的靜態ObjectInspector。 然后,父類將調用方法“ getInnerObjectInspector”,如果該方法為null,則使用帶有新實例的類似set方法對其進行設置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM