@Override
 public void writeValue(RandomAccessOutput dest) throws SerDeException {
   if (!(value instanceof BinaryComparable)) {
     throw new SerDeException("Unexpected type " + value.getClass().getCanonicalName());
   }
   BinaryComparable b = (BinaryComparable) value;
   dest.write(b.getBytes(), 0, b.getLength());
 }
 @Override
 public void writeKey(RandomAccessOutput dest) throws SerDeException {
   if (!(key instanceof BinaryComparable)) {
     throw new SerDeException("Unexpected type " + key.getClass().getCanonicalName());
   }
   sanityCheckKeyForTag();
   BinaryComparable b = (BinaryComparable) key;
   dest.write(b.getBytes(), 0, b.getLength() - (hasTag ? 1 : 0));
 }
 @Override
 public int getHashFromKey() throws SerDeException {
   if (!(key instanceof BinaryComparable)) {
     throw new SerDeException("Unexpected type " + key.getClass().getCanonicalName());
   }
   sanityCheckKeyForTag();
   BinaryComparable b = (BinaryComparable) key;
   return WriteBuffers.murmurHash(b.getBytes(), 0, b.getLength() - (hasTag ? 1 : 0));
 }
示例#4
0
 // Serialize the keys and append the tag
 protected HiveKey toHiveKey(Object obj, int tag, Integer distLength) throws SerDeException {
   BinaryComparable key = (BinaryComparable) keySerializer.serialize(obj, keyObjectInspector);
   int keyLength = key.getLength();
   if (tag == -1 || skipTag) {
     keyWritable.set(key.getBytes(), 0, keyLength);
   } else {
     keyWritable.setSize(keyLength + 1);
     System.arraycopy(key.getBytes(), 0, keyWritable.get(), 0, keyLength);
     keyWritable.get()[keyLength] = tagByte[0];
   }
   keyWritable.setDistKeyLength((distLength == null) ? keyLength : distLength);
   return keyWritable;
 }
 /**
  * If we received data with tags from ReduceSinkOperators, no keys will match. This should not
  * happen, but is important enough that we want to find out and work around it if some optimized
  * change causes RSO to pass on tags.
  */
 private void sanityCheckKeyForTag() throws SerDeException {
   if (hasTag != null) return;
   BinaryComparable b = (BinaryComparable) key;
   Object o = keySerDe.deserialize(key);
   StructObjectInspector soi = (StructObjectInspector) keySerDe.getObjectInspector();
   List<? extends StructField> fields = soi.getAllStructFieldRefs();
   Object[] data = new Object[fields.size()];
   List<ObjectInspector> fois = new ArrayList<ObjectInspector>(fields.size());
   for (int i = 0; i < fields.size(); i++) {
     data[i] = soi.getStructFieldData(o, fields.get(i));
     fois.add(fields.get(i).getFieldObjectInspector());
   }
   Output output = new Output();
   BinarySortableSerDe.serializeStruct(output, data, fois, new boolean[fields.size()]);
   hasTag = (output.getLength() != b.getLength());
   if (hasTag) {
     LOG.error("Tag found in keys and will be removed. This should not happen.");
     if (output.getLength() != (b.getLength() - 1)) {
       throw new SerDeException(
           "Unexpected tag: " + b.getLength() + " reserialized to " + output.getLength());
     }
   }
 }