/** * Re-initializes only the metric dictionaries using the unique metric values (computed after * aggregation). */ private void resetMetricDictionaries(Map<String, Set<Object>> uniqueMetricValues) throws Exception { for (MetricFieldSpec spec : schema.getMetricFieldSpecs()) { String column = spec.getName(); ColumnIndexCreationInfo info = columnInfo.get(column); // The new unique values Object[] valuesWithAggregates = uniqueMetricValues.get(column).toArray(); Arrays.sort(valuesWithAggregates); // Reset dictionaries dictionaryCreatorMap.put( column, new SegmentDictionaryCreator(info.hasNulls(), valuesWithAggregates, spec, outDir)); dictionaryCreatorMap.get(column).build(); } }
/** Converts a raw row into its (possibly partial) dimension and complete metric values */ private StarTreeTableRow extractValues(GenericRow row) { List<Integer> dimensions = new ArrayList<Integer>(); for (String dimensionName : schema.getDimensionNames()) { Integer valueId; if (schema.getFieldSpecFor(dimensionName).isSingleValueField() && !starTreeIndexSpec.getExcludedDimensions().contains(dimensionName)) { Object value = row.getValue(dimensionName); valueId = dictionaryCreatorMap.get(dimensionName).indexOfSV(value); } else { // Multi-value fields are not supported - always ALL valueId = V1Constants.STARTREE_ALL_NUMBER.intValue(); } dimensions.add(valueId); } List<Number> metrics = new ArrayList<Number>(schema.getMetricNames().size()); for (MetricFieldSpec metricFieldSpec : schema.getMetricFieldSpecs()) { Object value = row.getValue(metricFieldSpec.getName()); switch (metricFieldSpec.getDataType()) { case INT: metrics.add((Integer) value); break; case LONG: metrics.add((Long) value); break; case DOUBLE: metrics.add((Double) value); break; case FLOAT: metrics.add((Float) value); break; default: throw new IllegalStateException("Unsupported data type " + metricFieldSpec.getDataType()); } } return new StarTreeTableRow(dimensions, metrics); }