in hive/src/main/java/org/elasticsearch/hadoop/hive/EsSerDe.java [189:257]
static Object hiveFromWritable(TypeInfo type, Writable data, FieldAlias alias) {
if (data == null || data instanceof NullWritable) {
return null;
}
switch (type.getCategory()) {
case LIST: {// or ARRAY
ListTypeInfo listType = (ListTypeInfo) type;
TypeInfo listElementType = listType.getListElementTypeInfo();
ArrayWritable aw = (ArrayWritable) data;
List<Object> list = new ArrayList<Object>();
for (Writable writable : aw.get()) {
list.add(hiveFromWritable(listElementType, writable, alias));
}
return list;
}
case MAP: {
MapTypeInfo mapType = (MapTypeInfo) type;
Map<Writable, Writable> mw = (Map<Writable, Writable>) data;
Map<Object, Object> map = new LinkedHashMap<Object, Object>();
for (Entry<Writable, Writable> entry : mw.entrySet()) {
map.put(hiveFromWritable(mapType.getMapKeyTypeInfo(), entry.getKey(), alias),
hiveFromWritable(mapType.getMapValueTypeInfo(), entry.getValue(), alias));
}
return map;
}
case STRUCT: {
StructTypeInfo structType = (StructTypeInfo) type;
List<String> names = structType.getAllStructFieldNames();
List<TypeInfo> info = structType.getAllStructFieldTypeInfos();
// return just the values
List<Object> struct = new ArrayList<Object>();
MapWritable map = (MapWritable) data;
Text reuse = new Text();
for (int index = 0; index < names.size(); index++) {
String esAlias = alias.toES(names.get(index));
// check for multi-level alias
Writable result = map;
for (String level : StringUtils.tokenize(esAlias, ".")) {
reuse.set(level);
result = ((MapWritable) result).get(reuse);
if (result == null) {
break;
}
}
struct.add(hiveFromWritable(info.get(index), result, alias));
}
return struct;
}
case UNION: {
throw new UnsupportedOperationException("union not yet supported");//break;
}
case PRIMITIVE:
default:
// return as is
return data;
}
}