基本データセットに基づいてさまざまな方法で Thrift オブジェクトのエントリを処理する SerDe を使用しています。これは本質的に、結果をテーブルに格納するのではなく、実行時にデータの基本セットを処理する美化された Hive Struct です。最近、クラスターを 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)