0

Hive で UDTF を開発しているときに ClassCastException が発生します。

詳細は次のとおりです。

  1. for_each(start,stop,increment) のような 3 つのパラメーターを渡すことができる for ループのような機能を実装しようとしています。
  2. すべてのパラメーターを for_each(1 , 10 , 1) のような値として渡すと、正常に機能します。
  3. 一方、停止値パラメータについては、UDF 関数の 1 つの結果を渡そうとしています (例: for_each(1 , stopvalue() , 1 のような stopvlaue() 値)。stopo dovalue() 関数は IntWritable を返します。これを行うと、次の例外が発生します。

ここに私のUDTFがあります:

public class GenerateSeries extends GenericUDTF {
    IntWritable start;
    IntWritable end;
    IntWritable inc;
    Object[] forwardObj = null;



    @Override
    public StructObjectInspector initialize(ObjectInspector[] args) throws UDFArgumentException 
    {

        start=((WritableConstantIntObjectInspector) args[0]).getWritableConstantValue();
        end=((WritableConstantIntObjectInspector) args[1]).getWritableConstantValue();
        if (args.length == 3) 
        {
            inc =((WritableConstantIntObjectInspector) args[2]).getWritableConstantValue();
        } else {
            inc = new IntWritable(1);
        }
        this.forwardObj = new Object[1];
        ArrayList<String> fieldNames = new ArrayList<String>();
        ArrayList<ObjectInspector> fieldOIs = new ArrayList<ObjectInspector>();
        fieldNames.add("col0");
        fieldOIs.add(PrimitiveObjectInspectorFactory.getPrimitiveJavaObjectInspector(PrimitiveCategory.INT));
        return ObjectInspectorFactory.getStandardStructObjectInspector(fieldNames, fieldOIs);
    }
    @Override
    public void process(Object[] args) throws HiveException, UDFArgumentException 
    {
        for (int i = start.get(); i < end.get(); i = i + inc.get()) 
        {
            this.forwardObj[0] = new Integer(i);
            forward(forwardObj);
        }
    }

    @Override
    public void close() throws HiveException {
        // TODO Auto-generated method stub

    }
}

この問題を解決するにはどうすればよいですか?

前もって感謝します

4

1 に答える 1

0

このinitializeメソッドは、ほとんどの場合、関数への入力の実際の値を提供しません。これは、行ごとに異なる可能性があるためです。入力のタイプのみを示します。process実際の値は、メソッドからのみ一貫してアクセスできます。現在、定数に関する注目すべき例外を利用しています。代わりに従うべき一般的なパターンは次のとおりです。

  1. 入力インスペクターをinitializeメソッドのインスタンス変数に格納します。それらが期待どおりのタイプであることを確認できますが、常にそうであるとは限りませんWritableConstantIntObjectInspector。それらは常に のサブクラスである必要があり、メソッドPrimitiveObjectInspectorを呼び出すと、が返されます。getPrimitiveCategoryPrimtiveCategory.INT
  2. 保存された入力インスペクターを使用して、メソッドに渡されたオブジェクトのデータを取得しますprocess。例えば、Integer n = (Integer)inspector.getPrimitiveJavaObject(args[0])
于 2013-10-07T21:06:23.717 に答える