package com.facebook.hive.udf;
import org.apache.hadoop.hive.ql.exec.Description;
import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.hive.ql.udf.generic.GenericUDF;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorUtils;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorUtils.ObjectInspectorCopyOption;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;
import org.json.JSONObject;
import java.util.Map;
/**
* JSON-encode a Hive map. If the input is NULL then NULL is returned.
* NULLs within the input map are encoded as 'null'. A reasonable attempt is
* made to make sure the type of the values in the input map is preserved
* in the JSON output; however some types such as STRUCTs may be converted to
* strings before being encoded. Additionally, the keys will always be
* converted to strings.
*/
@Description(name = "make_json_obj",
value = "_FUNC_(map) - JSON encode a Hive map.")
public class UDFMakeJSONObj extends GenericUDF {
ObjectInspector inputOI;
@Override
public ObjectInspector initialize(ObjectInspector[] arguments)
throws UDFArgumentException {
inputOI = arguments[0];
return PrimitiveObjectInspectorFactory.javaStringObjectInspector;
}
@Override
public Object evaluate(DeferredObject[] arguments)
throws HiveException {
if (arguments[0].get() == null) {
return null;
}
Map<?,?> map = (Map<?,?>)ObjectInspectorUtils.copyToStandardObject(
arguments[0].get(),
inputOI,
ObjectInspectorCopyOption.JAVA);
JSONObject json_object = new JSONObject(map);
if (json_object == null) {
return null;
}
return json_object.toString();
}
@Override
public String getDisplayString(String[] input) {
return new String();
}
}