Hi,

If I get your code right, you are trying to implement a sort of explode
function for Map<Map<String,String>> that lists "aFieldName" values in the
inner map.
I think you could achieve this with a simple
LATERAL VIEW explode(mapmap) T as key, map
and then selecting map["aFieldName"].

If you want to go on with your UDTF (to complexify it I presume), I suggest
you to have a look at the implementation of the explode UDTF
https://github.com/apache/hive/blob/b8250ac2f30539f6b23ce80a20a9e338d3d31458/ql/src/java/org/apache/hadoop/hive/ql/udf/generic/GenericUDTFExplode.java
and try to do everything in a similar way.

For instance I noticed that your forwardObj is of type ArrayList<String>,
while it should probably be a a Text[].

Regards,

Furcy


2014-09-09 21:33 GMT+02:00 Echo Li <echo...@gmail.com>:

> Hi Furcy,
>
> Thanks for sharing. I modified my code to mark the map variables
> "transient" but still got same error. this is the code:
>
> public class fun_name extends GenericUDTF {
>
>     private PrimitiveObjectInspector stringOI = null;
>
>     transient Map<String, Map<String, String>> mapObject;
>     transient Map<String, String> eventDetails;
>
>     @Override
>     public void close() throws HiveException {
>
>     }
>
>     @Override
>     public StructObjectInspector initialize(ObjectInspector[] args) throws
> UDFArgumentException {
>
>         if (args.length != 1) {
>             throw new UDFArgumentException("fun_name() takes exactly one
> argument");
>         }
>
>         if (args[0].getCategory() != ObjectInspector.Category.PRIMITIVE
>             && ((PrimitiveObjectInspector) args[0]).getPrimitiveCategory()
> != PrimitiveObjectInspector.PrimitiveCategory.STRING) {
>             throw new UDFArgumentException("fun_name() takes a string as a
> parameter");
>         }
>
>         stringOI = (PrimitiveObjectInspector) args[0];
>
>
>         ArrayList<String> fieldNames = new ArrayList<String>(1);
>         ArrayList<ObjectInspector> fieldOIs = new
> ArrayList<ObjectInspector>(1);
>
>         fieldNames.add("field1");
>         fieldNames.add("field2");
>
>
> fieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
>
> fieldOIs.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);
>
>         return
> ObjectInspectorFactory.getStandardStructObjectInspector(fieldNames,
> fieldOIs);
>     }
>
>     @Override
>     public void process(Object[] record) throws HiveException {
>
>         ObjectMapper mapper = new ObjectMapper();
>
>         try {
>
>             final String document = (String)
> stringOI.getPrimitiveJavaObject(record[0]);
>
>             mapObject = mapper.readValue(document,
>                     new TypeReference<Map<String, Map<String, String>>>() {
>                     });
>
>             for (String someId : mapObject.keySet()) {
>
>
>                 eventDetails = mapObject.get(someId);
>
>                 List<String> forwardObj = new ArrayList<String>();
>
>                 forwardObj.add(someId);
>                 forwardObj.add(eventDetails.get("aFieldName"));
>
>                 forward(forwardObj);
>            }
>
>         }
>     }
> }
>
> to compile and build the jar:
>
> *javac -Xlint:deprecation fun_naemjavajar cvf from_json.jar
> from_json.class 'fun_name$1.class'*
>
> add jar and create function in hive:
>
>
> *add jar fun_name.jar;create temporary function fun_name as 'fun_name';*
> succeeded;
>
> when run a query, got error:
>
> Vertex failed, vertexName=Map 1, vertexId=vertex_1407434664593_24842_1_00,
> diagnostics=[Vertex Input: impression_test initializer failed., 
> o*rg.apache.hive.com.esotericsoftware.kryo.KryoException:
> Unable to find class: fun_name*
> Serialization trace:
> genericUDTF (org.apache.hadoop.hive.ql.plan.UDTFDesc)
> conf (org.apache.hadoop.hive.ql.exec.UDTFOperator)
> childOperators (org.apache.hadoop.hive.ql.exec.SelectOperator)
> childOperators (org.apache.hadoop.hive.ql.exec.TableScanOperator)
> aliasToWork (org.apache.hadoop.hive.ql.plan.MapWork)]
> DAG failed due to vertex failure. failedVertices:1 killedVertices:0
> FAILED: Execution Error, return code 2 from
> org.apache.hadoop.hive.ql.exec.tez.TezTask
>
>
> could be something else?
>
> On Tue, Sep 9, 2014 at 1:31 AM, Furcy Pin <furcy....@flaminem.com> wrote:
>
>> Hi,
>>
>> I think I encountered this kind of serialization problem when writing
>> UDFs.
>> Usually, marking every fields of the UDF as *transient* does the trick.
>>
>> I guess the error means that Kryo tries to serialize the UDF class and
>> everything that is inside, and by marking them as transient
>> you ensure that it will not and that they will be instantiated in the
>> default constructor or during the call of initialize()
>>
>> Please keep me informed if it works or not,
>>
>> Regards,
>>
>> Furcy
>>
>>
>> 2014-09-09 1:44 GMT+02:00 Echo Li <echo...@gmail.com>:
>>
>>> I wrote a UDTF in hive 0.13, the function parse a column which is json
>>> string and return a table. The function compiles successfully by adding
>>> hive-exec-0.13.0.2.1.2.1-471.jar to classpath, however when the jar is
>>> added to hive and a function created using the jar then I try to run a
>>> query using that function, I got error:
>>>
>>> org.apache.hive.com.esotericsoftware.kryo.KryoException: Unable to find
>>> class: class_name
>>>
>>> I went through all steps in a lower version hive (0.10) everything works
>>> fine, I searched around and seams that is caused by the ‘kryo” serde, so my
>>> question is, is there a fix? and where to find it?
>>>
>>> thank you.
>>>
>>
>>
>

Reply via email to