0

基本データセットに基づいてさまざまな方法で 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)
4

1 に答える 1

0

カスタム オブジェクトは、取得を要求するたびに新しい ObjectInspector を返していたことがわかりました。これにより、カスタム構造体の入力形式がエクスポートされた形式とは別のものであると Hive が認識し、Hive がデータを基本構造体オブジェクトに変換するようになりました。これは、基本的にすべてのフィールドを処理することを意味していました。

基本カスタム構造体定義で毎回新しい ObjectInspector を返す代わりに、拡張クラスに任せて、null として開始する静的な ObjectInspector を定義します。次に、親クラスはメソッド「getInnerObjectInspector」を呼び出し、null を取得した場合は、同様の set メソッドを使用して新しいインスタンスを設定します。

于 2013-10-08T17:58:55.603 に答える