/** * Create a new FijiColumnName from a family and qualifier. * * @param family Family of the Fiji column for which to create a name. * @param qualifier Qualifier of the Fiji column for which to create a name. * @return a new FijiColumnName from the given family and qualifier. */ public static FijiColumnName create( final String family, final String qualifier ) { return new FijiColumnName(family, qualifier); }
/** * Create a new FijiColumnName from a column's full name. * * <p> * The full name of a column is either "family" or "family:qualifier". An empty qualifier is * interpreted as a null qualifier (i.e. "family" and "family:" are treated the same. * </p> * * @param fullName The full name of the Fiji column for which to create a name. * @return a new FijiColumnName from the given full name. */ public static FijiColumnName create( final String fullName ) { return new FijiColumnName(fullName); }
/** * Determines whether a particular column has data in this row. * * @param family Column family of the column to check for. * @param qualifier Column qualifier of the column to check for. * @return Whether the specified column has data in this row. */ public boolean containsColumn(String family, String qualifier) { FijiColumnName column = new FijiColumnName(family, qualifier); return mWritableData.keySet().contains(column); }
/** * Gets the reader schema for a column as declared in the layout of the table this row * comes from. Opportunistically checks the family as though it's a map type family if the * qualifier isn't found. * * @param family Column family of the desired column schema. * @param qualifier Column qualifier of the desired column schema. * @return Avro reader schema for the column. * @throws IOException If there is an error or the column does not exist. * @see com.moz.fiji.schema.layout.FijiTableLayout */ public Schema getReaderSchema(String family, String qualifier) throws IOException { FijiColumnName column = new FijiColumnName(family, qualifier); if (mSchemas.containsKey(column)) { return mSchemas.get(column); } else { return mSchemas.get(new FijiColumnName(family)); } }
/** * Get the column name from a meta table key. Does not check if the metaTableKey is a valid * FijiTableAnnotator meta table key. This method is package private for testing. * * @param table FijiTable in which the column from the specified key lives. This will be used * for column name translation. * @param metaTableKey the meta table key from which to get the column name. * @return the column name stored in the given meta table key. * @throws com.moz.fiji.schema.NoSuchColumnException in case the column does not exist in the table. */ static FijiColumnName columnFromMetaTableKey( final CassandraFijiTable table, final String metaTableKey ) throws NoSuchColumnException { // Everything between the prefix and the annotation key. final String columnString = metaTableKey.substring(METATABLE_KEY_PREFIX.length(), metaTableKey.lastIndexOf('.')); return new FijiColumnName(columnString); }
/** * Sets the output column name. * * @param column The output column. */ @HadoopConf(key=CONF_OUTPUT, usage="The output column name.") protected void setOutputColumn(String column) { if (null == column || column.isEmpty()) { throw new RuntimeException("Must specify " + CONF_OUTPUT); } mOutputColumn = new FijiColumnName(column); }
/** * Gets all data stored within the specified column. * * @param family Column family of the desired data. * @param qualifier Column qualifier of the desired data. * @param <T> Type of the data stored at the specified coordinates. * @return A sorted map containing the data stored in the specified column. * @throws IOException If there is an error. */ public <T> NavigableMap<Long, T> getValues(String family, String qualifier) throws IOException { FijiColumnName column = new FijiColumnName(family, qualifier); return (NavigableMap<Long, T>) getDecodedData().get(column); }
/** * Sets the column to retrieve values from. * * @param family the column family to use. * @param qualifier the column qualifier to use. * @return this builder instance. */ public Builder withColumn(String family, String qualifier) { return withColumn(new FijiColumnName(family, qualifier)); }
/** * Sets the input column name. * * @param column The input column. */ @HadoopConf(key=CONF_INPUT, usage="The input column name.") protected void setInputColumn(String column) { if (null == column || column.isEmpty()) { throw new RuntimeException("Must specify " + CONF_INPUT); } mInputColumn = new FijiColumnName(column); }
/** * Sets the configuration for cell level paging. * * @param cellPagingMap map of column names to page sizes. * @return This instance */ public HiveTableDescriptionBuilder withCellPagingMap(Map<String, String> cellPagingMap) { checkNotBuilt(); Map<FijiColumnName, Integer> convertedCellPagingMap = Maps.newHashMap(); for (Entry<String, String> entry : cellPagingMap.entrySet()) { FijiColumnName fijiColumnName = new FijiColumnName(entry.getKey()); Integer pageSize = Integer.valueOf(entry.getValue()); convertedCellPagingMap.put(fijiColumnName, pageSize); } mCellPagingMap = convertedCellPagingMap; return this; }
/** * Sets the configuration for qualifier level paging. * * @param qualifierPagingMap map of column families to page sizes. * @return This instance */ public HiveTableDescriptionBuilder withQualifierPagingMap( Map<String, String> qualifierPagingMap) { checkNotBuilt(); Map<FijiColumnName, Integer> convertedQualifierPagingMap = Maps.newHashMap(); for (Entry<String, String> entry : qualifierPagingMap.entrySet()) { FijiColumnName fijiColumnName = new FijiColumnName(entry.getKey()); Integer pageSize = Integer.valueOf(entry.getValue()); convertedQualifierPagingMap.put(fijiColumnName, pageSize); } mQualifierPagingMap = convertedQualifierPagingMap; return this; }
/** * Initialize the family and qualifier instance variables. */ private void initializeInputColumn() { mInputColumn = new FijiColumnName(getInputColumn()); if (!mInputColumn.isFullyQualified()) { throw new RuntimeException("getInputColumn() must contain a colon (':')"); } }
/** {@inheritDoc} */ @Override protected void setup(Context context) throws IOException { super.setup(context); Preconditions.checkState(mProducerContext == null); final Configuration conf = context.getConfiguration(); mProducer = FijiProducers.create(conf); final String column = Preconditions.checkNotNull(mProducer.getOutputColumn()); mOutputColumn = new FijiColumnName(column); mProducerContext = InternalProducerContext.create(context, mOutputColumn); mProducer.setup(mProducerContext); }
/** * Sets the family. * * @param family The family. */ @HadoopConf(key=CONF_EXPORT_FAMILY) protected void setFamily(String family) { FijiColumnName name = new FijiColumnName(family); if (name.isFullyQualified()) { throw new RuntimeException("Expected an unqualified map type family. " + "Requested family was: " + name.getName()); } mFamily = family; }
/** {@inheritDoc} */ @Override public void setup(FijiContext context) throws IOException { super.setup(context); final CellRewriteSpec spec = getSpecFromConf(getConf()); mColumn = new FijiColumnName(spec.getColumn()); LOG.info("Rewriting cells for column {}", mColumn); // Build the map of schema-rewrite rules: mRules = Maps.newHashMap(); final JavaAvroDSL avroDSL = new JavaAvroDSL(); for (Map.Entry<String, String> entry : spec.getRules().entrySet()) { final Schema fromSchema = new Schema.Parser().parse(entry.getKey()); final Schema toSchema = new Schema.Parser().parse(entry.getValue()); mRules.put(fromSchema, toSchema); LOG.info("Rewriting cell with schema {} into schema {}", avroDSL.schemaToString(fromSchema), avroDSL.schemaToString(toSchema)); } // TODO(FIJIMR-264) Validate the requested conversion. In particular, detect cycles. }
/** {@inheritDoc} */ @Override public FijiColumnName toFijiColumnName(HBaseColumnName hbaseColumnName) throws NoSuchColumnException { LOG.debug("Translating HBase column name '{}' to Fiji column name.", hbaseColumnName); final String familyName = Bytes.toString(hbaseColumnName.getFamily()); final String qualifierName = Bytes.toString(hbaseColumnName.getQualifier()); final FamilyLayout family = mLayout.getFamilyMap().get(familyName); // Validate that the family exists if (family == null) { throw new NoSuchColumnException(String.format("No family %s in layout for table %s.", familyName, mLayout.getName())); } // Validate that the qualifier exists final ColumnLayout qualifier = family.getColumnMap().get(qualifierName); if (qualifier == null) { throw new NoSuchColumnException(String.format("No qualifier %s in family %s of table %s.", qualifierName, familyName, mLayout.getName())); } final FijiColumnName fijiColumnName = new FijiColumnName(familyName, qualifierName); LOG.debug("Translated to Fiji column '{}'.", fijiColumnName); return fijiColumnName; }
/** {@inheritDoc} */ @Override public void deleteCell(EntityId entityId, String family, String qualifier, long timestamp) throws IOException { final FijiColumnName fijiColumn = new FijiColumnName(family, qualifier); final HBaseColumnName hbaseColumn = mColumnNameTranslator.toHBaseColumnName(fijiColumn); final HFileKeyValue mrKey = new HFileKeyValue( entityId.getHBaseRowKey(), hbaseColumn.getFamily(), hbaseColumn.getQualifier(), timestamp, HFileKeyValue.Type.DeleteCell, HConstants.EMPTY_BYTE_ARRAY); write(mrKey); }
/** {@inheritDoc} */ @Override public void deleteColumn(EntityId entityId, String family, String qualifier, long upToTimestamp) throws IOException { final FijiColumnName fijiColumn = new FijiColumnName(family, qualifier); final HBaseColumnName hbaseColumn = mColumnNameTranslator.toHBaseColumnName(fijiColumn); final HFileKeyValue mrKey = new HFileKeyValue( entityId.getHBaseRowKey(), hbaseColumn.getFamily(), hbaseColumn.getQualifier(), upToTimestamp, HFileKeyValue.Type.DeleteColumn, HConstants.EMPTY_BYTE_ARRAY); write(mrKey); }
/** {@inheritDoc} */ @Override public void produce(FijiRowData input, ProducerContext context) throws IOException { if (!mInputColumn.isFullyQualified()) { // Copy the entire family. for (String qualifier : input.getQualifiers(mInputColumn.getFamily())) { FijiColumnName sourceColumn = new FijiColumnName(mInputColumn.getFamily(), qualifier); produceAllVersions(input, context, sourceColumn); } } else { // Copy just a specific column. produceAllVersions(input, context, mInputColumn); } }
/** {@inheritDoc} */ @SuppressWarnings("unchecked") @Override public <T> void put(EntityId entityId, String family, String qualifier, long timestamp, T value) throws IOException { final FijiColumnName fijiColumn = new FijiColumnName(family, qualifier); final HBaseColumnName hbaseColumn = mColumnNameTranslator.toHBaseColumnName(fijiColumn); final CellSpec cellSpec = mTable.getLayout().getCellSpec(fijiColumn) .setSchemaTable(mFiji.getSchemaTable()); final FijiCellEncoder encoder = DefaultFijiCellEncoderFactory.get().create(cellSpec); final HFileKeyValue mrKey = new HFileKeyValue( entityId.getHBaseRowKey(), hbaseColumn.getFamily(), hbaseColumn.getQualifier(), timestamp, encoder.encode(value)); write(mrKey); }