Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hive 配置单元UDF返回类型数组<;int>;_Hive - Fatal编程技术网

Hive 配置单元UDF返回类型数组<;int>;

Hive 配置单元UDF返回类型数组<;int>;,hive,Hive,我正在编写一个基于split()GenericUDF的配置单元UDF。我的函数split_int()接受字符串参数split_int(str,regex)。我想返回array,但得到的是array 代码: public类splitIntudsflit扩展了GenericUDF{ 私有ObjectInspectorConverters.Converter[]转换器; @凌驾 公共ObjectInspector initialize(ObjectInspector[]参数)引发UDFArgument

我正在编写一个基于split()GenericUDF的配置单元UDF。我的函数split_int()接受字符串参数
split_int(str,regex)
。我想返回
array
,但得到的是
array

代码:

public类splitIntudsflit扩展了GenericUDF{
私有ObjectInspectorConverters.Converter[]转换器;
@凌驾
公共ObjectInspector initialize(ObjectInspector[]参数)引发UDFArgumentException{
if(arguments.length!=2){
抛出新的UDFargumentLength异常(
“函数SPLIT(s,regexp)正好包含2个参数。”);
}
转换器=新ObjectInspectorConverters.Converter[参数.length];
for(int i=0;i

如何使udf返回
数组

初始化方法的最后一行对我来说显然是正确的…这让我觉得这不是你的代码的问题,而是你如何将它加载到配置单元中的问题。也许你有一个旧版本的jar在某处浮动?进行新的构建,将它重新上传到任何地方hive正在从添加它,请确保类路径上没有其他版本(
find/-name“which.jar”
),等等。另外,您能否具体说明如何调用UDF?我使用cloudera的色调面板添加UDF jar(CDH4.4)。我尝试调用UDF split_int(“1,2,3”,“3”),它返回数组[“1”,“2”,“3”]类型为数组。我尝试了硬编码结果。添加(新IntWritable(1));对于上面的函数调用,我得到了[“1”、“1”、“1”]字符串数组…@JoeK您是对的,重新启动配置单元和色调解决了问题,我得到了预期的结果。
public class SplitIntUDFSplit extends GenericUDF {
     private ObjectInspectorConverters.Converter[] converters;

     @Override
     public ObjectInspector initialize(ObjectInspector[] arguments) throws UDFArgumentException {
           if (arguments.length != 2) {
              throw new UDFArgumentLengthException(
              "The function SPLIT(s, regexp) takes exactly 2 arguments.");
           }

           converters = new ObjectInspectorConverters.Converter[arguments.length];
           for (int i = 0; i < arguments.length; i++) {
           converters[i] = ObjectInspectorConverters.getConverter(arguments[i],
                PrimitiveObjectInspectorFactory.writableStringObjectInspector);
           }
           return ObjectInspectorFactory.
            getStandardListObjectInspector(PrimitiveObjectInspectorFactory.writableIntObjectInspector);
     }

     @Override
     public Object evaluate(DeferredObject[] arguments) throws HiveException {
         assert (arguments.length == 2);

           if (arguments[0].get() == null || arguments[1].get() == null) {
               return null;
           }

           Text s = (Text) converters[0].convert(arguments[0].get());
           Text regex = (Text) converters[1].convert(arguments[1].get());

           ArrayList<IntWritable> result = new ArrayList<IntWritable>();


           for (String str : s.toString().split(regex.toString())) {
                  result.add(new IntWritable(Integer.parseInt(str)));
           }
           return result;
     }