/** * Creates a ByteArray wrapper object. * @param buffer Underlying buffer. * @param offset Offset to start in buffer. * @param len Length of data. */ public ByteArray(ByteBuffer buffer, int offset, int len) { set(buffer, offset, len); }
@Override public boolean next(LongWritable key, Text value) throws IOException { try { if (!reader_.records().hasNext()) return false; Records.Record record = reader_.records().next(); if (record.isNull(0)) { value.set(EMPTY); } else { ByteArray data = record.nextByteArray(0); value.set(data.byteBuffer().array(), data.offset(), data.len()); } key.set(recordNum_++); return true; } catch (RecordServiceException e) { throw new IOException("Could not get next record.", e); } }
case VARCHAR: case CHAR: record.put(i, rsRecord.nextByteArray(rsIndex).toString()); break;
protected Record(Schema schema) { recordIdx_ = -1; colOffsets_ = new long[schema.cols.size()]; colData_ = new ByteBuffer[schema.cols.size()]; byteArrayVals_ = new ByteArray[schema.cols.size()]; timestampNanos_ = new TimestampNanos[schema.cols.size()]; decimalVals_ = new Decimal[schema.cols.size()]; nulls_ = new ByteBuffer[schema.cols.size()]; byteArrayLen_ = new int[schema.cols.size()]; schema_ = schema; for (int i = 0; i < colOffsets_.length; ++i) { Schema.TypeDesc type = schema_.cols.get(i).type; if (type.typeId == Schema.Type.STRING || type.typeId == Schema.Type.VARCHAR) { byteArrayVals_[i] = new ByteArray(); } if (type.typeId == Schema.Type.TIMESTAMP_NANOS) { timestampNanos_[i] = new TimestampNanos(); } if (type.typeId == Schema.Type.CHAR) { byteArrayVals_[i] = new ByteArray(); byteArrayLen_[i] = type.len; } else { byteArrayLen_[i] = -1; } if (type.typeId == Schema.Type.DECIMAL) { decimalVals_[i] = new Decimal(type.precision, type.scale); byteArrayLen_[i] = Decimal.computeByteSize(type.precision, type.scale); } } }
/** * Advances to the next record. * Returns true if there are more values to retrieve, false otherwise. */ @Override public boolean nextKeyValue() throws IOException, InterruptedException { try { if (!reader_.records().hasNext()) return false; } catch (RecordServiceException e) { // TODO: is this the most proper way to deal with this in MR? throw new IOException("Could not fetch record.", e); } Records.Record record = reader_.records().next(); if (record.isNull(0)) { record_.set(EMPTY); } else { ByteArray data = record.nextByteArray(0); record_.set(data.byteBuffer().array(), data.offset(), data.len()); } currentKey_.set(recordNum_++); return true; }
case VARCHAR: case CHAR: record.put(i, rsRecord.nextByteArray(i).toString()); break; default: throw new RuntimeException(
ByteArray s = record.nextByteArray(i); ((Text) columnValObjects_[i]).set( s.byteBuffer().array(), s.offset(), s.len()); break; case TIMESTAMP_NANOS:
public final ByteArray nextByteArray(int colIdx) { int len = byteArrayLen_[colIdx]; if (len < 0) { len = unsafe.getInt(colData_[colIdx].array(), colOffsets_[colIdx]); colOffsets_[colIdx] += 4; } long offset = colOffsets_[colIdx] - byteArrayOffset; byteArrayVals_[colIdx].set(colData_[colIdx], (int)offset, len); colOffsets_[colIdx] += len; return byteArrayVals_[colIdx]; }