in athena-federation-sdk/src/main/java/com/amazonaws/athena/connector/lambda/handlers/GlueMetadataHandler.java [316:360]
protected GetTableResponse doGetTable(BlockAllocator blockAllocator, GetTableRequest request, TableFilter filter)
throws Exception
{
TableName tableName = request.getTableName();
com.amazonaws.services.glue.model.GetTableRequest getTableRequest = new com.amazonaws.services.glue.model.GetTableRequest();
getTableRequest.setCatalogId(getCatalog(request));
getTableRequest.setDatabaseName(tableName.getSchemaName());
getTableRequest.setName(tableName.getTableName());
GetTableResult result = awsGlue.getTable(getTableRequest);
Table table = result.getTable();
if (filter != null && !filter.filter(table)) {
throw new RuntimeException("No matching table found " + request.getTableName());
}
SchemaBuilder schemaBuilder = SchemaBuilder.newBuilder();
if (table.getParameters() != null) {
table.getParameters().entrySet().forEach(next -> schemaBuilder.addMetadata(next.getKey(), next.getValue()));
}
//A column name mapping can be provided to get around restrictive Glue naming rules
Map<String, String> columnNameMapping = getColumnNameMapping(table);
Set<String> partitionCols = new HashSet<>();
if (table.getPartitionKeys() != null) {
partitionCols = table.getPartitionKeys()
.stream().map(next -> columnNameMapping.getOrDefault(next.getName(), next.getName())).collect(Collectors.toSet());
}
for (Column next : table.getStorageDescriptor().getColumns()) {
String mappedColumnName = columnNameMapping.getOrDefault(next.getName(), next.getName());
schemaBuilder.addField(convertField(mappedColumnName, next.getType()));
if (next.getComment() != null) {
schemaBuilder.addMetadata(mappedColumnName, next.getComment());
}
}
populateSourceTableNameIfAvailable(table, schemaBuilder);
return new GetTableResponse(request.getCatalogName(),
request.getTableName(),
schemaBuilder.build(),
partitionCols);
}