2016-07-23 7 views
0

Ich habe die folgende Struktur Abfrage geschrieben. Hier versuche ich eine Spalte (msg) des Kartendatentyps in meiner Join-Klausel zu verwenden.Hive-Abfrage mit Map-Datentyp schlägt fehl

select p.p_id, count(*) from prod_json n 
inner join res_pan p on n.msg["mid"] = p.id 
where n.cat='XYX' 
group by p.p_id limit 10; 

Diese Abfrage schlägt immer fehl mit Fehlermeldung

[Error getting row data with exception java.lang.ClassCastException: 
java.lang.String cannot be cast to org.openx.data.jsonserde.json.JSONObject at 
org.openx.data.jsonserde.objectinspector.JsonMapObjectInspector.getMap(Json 
MapObjectInspector.java:40) at 
org.apache.hadoop.hive.serde2.SerDeUtils.buildJSONString(SerDeUtils.java:317) at 
org.apache.hadoop.hive.serde2.SerDeUtils.buildJSONString(SerDeUtils.java:353) at 
org.apache.hadoop.hive.serde2.SerDeUtils.getJSONString(SerDeUtils.java:197) at 
org.apache.hadoop.hive.serde2.SerDeUtils.getJSONString(SerDeUtils.java:183) at 
org.apache.hadoop.hive.ql.exec.MapOperator.toErrorMessage(MapOperator.java: 
529) at 
org.apache.hadoop.hive.ql.exec.MapOperator.process(MapOperator.java:502) at 
org.apache.hadoop.hive.ql.exec.mr.ExecMapper.map(ExecMapper.java:170) at 
org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:54) at 
org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:453) at 

Antwort

0

Ich glaube, ich in der Lage war, das Problem zu lösen. Ich wieder schrieb meine Abfrage als

select t2.p_id, count(*) 
from (select cat, msg["mid"] as mid from prod_json) t1 
join (select id, p_id from res_pan) t2 
on t1.mid = t2.id 
where t1.cat = 'XYZ' 
group by t2.p_id 

Also im Grunde nicht versuchen, die Karte Spalt direkt zu verwenden, aber ersten Platten der Karte in Spalten von inneren Abfragen mit und dann auf diejenigen zu verbinden.