public Map<String, Object> getMap(String key) throws Exception { if (data instanceof OrcStruct) { OrcStruct orcStruct = (OrcStruct) data; OrcMap value = (OrcMap) orcStruct.getFieldValue(key); if (value != null && value.size() > 0) { Map<String, Object> map = new HashMap<String, Object>(); Set<Map.Entry<Object, Object>> set = value.entrySet(); for (Map.Entry<Object, Object> entry : set) { if (entry.getValue() instanceof OrcStruct) { map.put(((Text) entry.getKey()).toString(), new OrcRecord(entry.getValue())); } else { map.put(((Text) entry.getKey()).toString(), entry.getValue()); } } return map; } } return null; }
@Override public void write(DataOutput output) throws IOException { output.writeInt(size()); for(Map.Entry<K,V> entry: entrySet()) { K key = entry.getKey(); V value = entry.getValue(); output.writeByte((key == null ? 0 : 2) | (value == null ? 0 : 1)); if (key != null) { key.write(output); } if (value != null) { value.write(output); } } }
static void setMapValue(TypeDescription schema, MapColumnVector vector, int row, OrcMap<?,?> value) { TypeDescription keyType = schema.getChildren().get(0); TypeDescription valueType = schema.getChildren().get(1); vector.offsets[row] = vector.childCount; vector.lengths[row] = value.size(); vector.childCount += vector.lengths[row]; vector.keys.ensureSize(vector.childCount, vector.offsets[row] != 0); vector.values.ensureSize(vector.childCount, vector.offsets[row] != 0); int e = 0; for(Map.Entry<?,?> entry: value.entrySet()) { setColumn(keyType, vector.keys, (int) vector.offsets[row] + e, (Writable) entry.getKey()); setColumn(valueType, vector.values, (int) vector.offsets[row] + e, (Writable) entry.getValue()); e += 1; } }