实现步骤:
1.将写好的代码打包上传到hdfs目录:/user/lib/
2.执行如下命令:
drop function getJsonArrSingle;
ADD JAR hdfs://nameservice1/user/lib/JsonArrSingle.jar;
ADD JAR hdfs://nameservice1/user/lib/fastjson-1.2.83.jar;
CREATE FUNCTION getJsonArrSingle AS 'com.mingyang.GetJsonArrSingleUDTF'USING JAR 'hdfs://nameservice1/user/lib/JsonArrSingle.jar',JAR 'hdfs://nameservice1/user/lib/fastjson-1.2.83.jar';
reload functions;
3.测试:
4. JAR包中代码如下:
package com.mingyang;
import com.alibaba.fastjson.JSONArray;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.hive.ql.udf.generic.GenericUDTF;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory;
import org.apache.hadoop.hive.serde2.objectinspector.StructObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
@Slf4j
public class GetJsonArrSingleUDTF extends GenericUDTF {
/* private IntObjectInspector intInspector;
private DoubleObjectInspector doubleInspector;
private BooleanObjectInspector booleanInspector;
private TimestampObjectInspector timestampInspector;
private DateObjectInspector dateInspector;
private BinaryObjectInspector binaryInspector;*/
private static final Logger logger = LoggerFactory.getLogger(GetJsonArrSingleUDTF.class);
@Override
public StructObjectInspector initialize(StructObjectInspector args) throws UDFArgumentException {
ArrayList<String> fieldNames = new ArrayList<String>();
ArrayList<ObjectInspector> fieldInspectors = new ArrayList<>();
// Input argument inspectors
/*StringObjectInspector stringInspector1 = (StringObjectInspector) args[0];
StringObjectInspector stringInspector2 = (StringObjectInspector) args[1];*/
// Output field names and inspectors
fieldNames.add("json");
fieldInspectors.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
return ObjectInspectorFactory.getStandardStructObjectInspector(fieldNames, fieldInspectors);
}
@Override
public void process(Object[] args) throws HiveException {
if(args !=null && args.length !=0 && args[0] !=null && StringUtils.isNoneEmpty(String.valueOf(args[0]))) {
String jsonArrStr = String.valueOf(args[0]);
JSONArray arr = JSONArray.parseArray(jsonArrStr);
for (int i = 0; i < arr.size(); i++) {
forward(new String[]{String.valueOf(arr.get(i))});
}
}else{
forward(new String[]{null});
}
}
@Override
public void close() throws HiveException {
// Clean up resources, if any
}
}