hiveのudtf使用
2932 ワード
HIVEのカスタム関数は、UDF、UDAF、UDTFがあり、それぞれ一進一出、多進一出、一進多出の操作を実現する
今日はUDTFの使用を1つだけ共有し、他の2つは後で共有します.
シーン:UDTFを使用してJSON列を解析する
くだらないことは言わないで、直接コードに行きます
UDTFを書くにはGenericUDTFクラスを継承し、initialize,process,closeの3つの方法を実現しなければならない.initializeは各行の列名とタイプを定義し、process方法はデータに対する操作であり、1行を複数行に分割することである.1行に複数の列があることに注意するには、集合が必要であり、close方法は実現しなくてもよい
今日はUDTFの使用を1つだけ共有し、他の2つは後で共有します.
シーン:UDTFを使用してJSON列を解析する
くだらないことは言わないで、直接コードに行きます
UDTFを書くにはGenericUDTFクラスを継承し、initialize,process,closeの3つの方法を実現しなければならない.initializeは各行の列名とタイプを定義し、process方法はデータに対する操作であり、1行を複数行に分割することである.1行に複数の列があることに注意するには、集合が必要であり、close方法は実現しなくてもよい
package dw.udf;
import java.util.ArrayList;
import java.util.Iterator;
import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
import org.apache.hadoop.hive.ql.exec.UDFArgumentLengthException;
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.json.JSONArray;
import org.json.JSONObject;
public class JsonParse extends GenericUDTF {// GenericUDTF
@Override
public StructObjectInspector initialize(ObjectInspector[] args) throws UDFArgumentException {
if (args.length != 1) {
throw new UDFArgumentLengthException("ExplodeMap takes only one argument");
}
if (args[0].getCategory() != ObjectInspector.Category.PRIMITIVE) {
throw new UDFArgumentException("ExplodeMap takes string as a parameter");
}
ArrayList<String> fieldNames = new ArrayList<String>();//
ArrayList<ObjectInspector> fieldOIs = new ArrayList<ObjectInspector>();
fieldNames.add("containerid");
fieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
fieldNames.add("first_step");
fieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
fieldNames.add("second_step");
fieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
fieldNames.add("third_step");
fieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
return ObjectInspectorFactory.getStandardStructObjectInspector(fieldNames, fieldOIs);
}
@SuppressWarnings("rawtypes")
@Override
public void process(Object[] args) throws HiveException {
try {
JSONObject obj = new JSONObject(args[0].toString());
Iterator it = obj.keys();
while (it.hasNext()) {
String key = (String) it.next();
JSONArray array = obj.getJSONArray(key);
if (key.indexOf("&") != -1) {
key = key.substring(0, key.indexOf("&"));
}
String[] outstr = new String[4];
outstr[0] = key;
for (int i = 0; i < array.length(); i++) {
outstr[i + 1] = array.getString(i);
}
forward(outstr);
}
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void close() throws HiveException {
}
}