in amoro-format-hudi/src/main/java/org/apache/amoro/formats/hudi/HudiTableDescriptor.java [114:218]
public ServerTableMeta getTableDetail(AmoroTable<?> amoroTable) {
HoodieJavaTable hoodieTable = (HoodieJavaTable) amoroTable.originalTable();
HoodieTableMetaClient metaClient = hoodieTable.getMetaClient();
HoodieTableConfig hoodieTableConfig = metaClient.getTableConfig();
TableSchemaResolver schemaResolver = new TableSchemaResolver(metaClient);
ServerTableMeta meta = new ServerTableMeta();
meta.setTableIdentifier(amoroTable.id());
meta.setTableType(TableFormat.HUDI.name());
List<AMSColumnInfo> columns = Lists.newArrayList();
try {
Schema scheme = schemaResolver.getTableAvroSchema(false);
scheme
.getFields()
.forEach(
field -> {
AMSColumnInfo columnInfo = new AMSColumnInfo();
columnInfo.setField(field.name());
columnInfo.setType(
HudiTableUtil.convertAvroSchemaToFieldType(field.schema()).toLowerCase());
columnInfo.setRequired(true);
columnInfo.setComment(field.doc());
columns.add(columnInfo);
});
} catch (Exception e) {
throw new IllegalStateException("Error when parse table schema", e);
}
Map<String, AMSColumnInfo> columnMap =
columns.stream().collect(Collectors.toMap(AMSColumnInfo::getField, Function.identity()));
meta.setSchema(columns);
meta.setProperties(amoroTable.properties());
meta.setBaseLocation(metaClient.getBasePathV2().toString());
if (hoodieTableConfig.isTablePartitioned()) {
String[] partitionFields = hoodieTableConfig.getPartitionFields().get();
List<AMSPartitionField> partitions = new ArrayList<>(partitionFields.length);
for (String f : partitionFields) {
if (columnMap.containsKey(f)) {
partitions.add(new AMSPartitionField(f, null, null, null, null));
}
}
meta.setPartitionColumnList(partitions);
}
if (hoodieTableConfig.getRecordKeyFields().map(f -> f.length > 0).orElse(false)) {
String[] recordFields = hoodieTableConfig.getRecordKeyFields().get();
List<AMSColumnInfo> primaryKeys = Lists.newArrayList();
for (String field : recordFields) {
if (columnMap.containsKey(field)) {
primaryKeys.add(columnMap.get(field));
}
}
meta.setPkList(primaryKeys);
}
HoodieTableMetadata hoodieTableMetadata = hoodieTable.getMetadata();
List<String> partitions;
try {
partitions = hoodieTableMetadata.getAllPartitionPaths();
} catch (IOException e) {
throw new RuntimeException("Error when load partitions for table: " + amoroTable.id(), e);
}
SyncableFileSystemView fileSystemView = hoodieTable.getHoodieView();
Map<String, HudiTableUtil.HoodiePartitionMetric> metrics =
HudiTableUtil.statisticPartitionsMetric(partitions, fileSystemView, ioExecutors);
long baseFileCount = 0;
long logFileCount = 0;
long totalBaseSizeInByte = 0;
long totalLogSizeInByte = 0;
for (HudiTableUtil.HoodiePartitionMetric m : metrics.values()) {
baseFileCount += m.getBaseFileCount();
logFileCount += m.getLogFileCount();
totalBaseSizeInByte += m.getTotalBaseFileSizeInBytes();
totalLogSizeInByte += m.getTotalLogFileSizeInBytes();
}
long totalFileCount = baseFileCount + logFileCount;
long totalFileSize = totalBaseSizeInByte + totalLogSizeInByte;
String averageFileSize =
CommonUtil.byteToXB(totalFileCount == 0 ? 0 : totalFileSize / totalFileCount);
String tableType = metaClient.getTableType() == HoodieTableType.COPY_ON_WRITE ? "cow" : "mor";
String tableFormat = "Hudi(" + tableType + ")";
TableSummary tableSummary =
new TableSummary(
totalFileCount, CommonUtil.byteToXB(totalFileSize), averageFileSize, 0, tableFormat);
meta.setTableSummary(tableSummary);
Map<String, Object> baseSummary = new HashMap<>();
baseSummary.put("totalSize", CommonUtil.byteToXB(totalBaseSizeInByte));
baseSummary.put("fileCount", baseFileCount);
baseSummary.put(
"averageFileSize",
CommonUtil.byteToXB(baseFileCount == 0 ? 0 : totalBaseSizeInByte / baseFileCount));
meta.setBaseMetrics(baseSummary);
if (HoodieTableType.MERGE_ON_READ == metaClient.getTableType()) {
Map<String, Object> logSummary = new HashMap<>();
logSummary.put("totalSize", CommonUtil.byteToXB(totalLogSizeInByte));
logSummary.put("fileCount", logFileCount);
logSummary.put(
"averageFileSize",
CommonUtil.byteToXB(logFileCount == 0 ? 0 : totalLogSizeInByte / logFileCount));
meta.setChangeMetrics(logSummary);
}
return meta;
}