如何在java中获取基本对象检查器的字段名

b5buobof  于 2021-06-26  发布在  Hive
关注(0)|答案(1)|浏览(384)

我正在尝试为我为hiveql环境创建的udf解决这个问题。

public ObjectInspector initialize(ObjectInspector[] arguments)
            throws UDFArgumentException {
    if (arguments.length != 1) {
        throw new UDFArgumentException("Usage : multiple_prop(primitive var) ");
    }
    // This will be an string
    moi = (PrimitiveObjectInspector) arguments[0];

    ArrayList structFieldNames = new ArrayList();
    ArrayList structFieldObjectInspectors = new ArrayList();

    structFieldNames.add("fields name"); <-- Issue is here

我怎么才能把域名放进去?这很容易做到 structObjectInspectors ,但我们如何在 PrimitiveObjectInspectors ?
完整的代码就是这个

public class prop_step2 extends GenericUDF {
    private PrimitiveObjectInspector moi;
    @Override
    public ObjectInspector initialize(ObjectInspector[] arguments)
            throws UDFArgumentException {
        if (arguments.length != 1) {
            throw new UDFArgumentException("Usage : multiple_prop(primitive var) ");
        }
        // This will be an string
        moi = (PrimitiveObjectInspector) arguments[0];

        ArrayList structFieldNames = new ArrayList();
        ArrayList structFieldObjectInspectors = new ArrayList();
        // Change this to get the input variable name, and not the type name
        structFieldNames.add(moi.getTypeName());<-- Change this to field name
        structFieldObjectInspectors.add( PrimitiveObjectInspectorFactory.writableStringObjectInspector );

       return ObjectInspectorFactory.getStandardStructObjectInspector(structFieldNames, structFieldObjectInspectors);
    }

    @Override
    public Object evaluate(DeferredObject[] arguments) throws HiveException {
        Object[] result;
        result = new Object[1];
        Text elem1 = new Text((String) moi.getPrimitiveJavaObject(arguments[0].get()));
        result[0]= elem1;
        return result;
    }
    @Override
    public String getDisplayString(String[] children) {
        return "stop";
    }}

完成后,我想从hive中将此udf称为:

CREATE TEMPORARY FUNCTION step AS 'UDFpack.prop_step2';
select 
step(bit) as sd
from my_table

我希望,如果在上面的select中,我这样做了:sd.bit,我会得到'bit'的值。

j2qf4p5b

j2qf4p5b1#

这根本不可能。传递给udf的信息—ObjectInspector—不包含它们的名称。这就是为什么您可以看到输出列名被更改为\u col0,\u col1。。在Hive计划的中间阶段。我对此也很恼火,认为这是Hive的疏忽。
一个解决方法是将您的输入放入一个结构并解析它。
i、 e步骤(名为_struct('bit',bit)),然后您可以在自定义项中获得结构的字段名。但这并不是那么好

相关问题