Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions src/Storages/ObjectStorage/DataLakes/DataLakeConfiguration.h
Original file line number Diff line number Diff line change
Expand Up @@ -323,6 +323,15 @@ class DataLakeConfiguration : public BaseStorageConfiguration, public std::enabl
return current_metadata->getColumnMapperForCurrentSchema(storage_metadata_snapshot, context);
}

Names getIdentityPartitionColumnNames(ContextPtr context) const override
{
if (!current_metadata)
{
return {};
}
return current_metadata->getIdentityPartitionColumnNames(context);
}

void drop(ContextPtr local_context) override
{
if (current_metadata)
Expand Down Expand Up @@ -806,6 +815,8 @@ class StorageIcebergConfiguration : public StorageObjectStorageConfiguration, pu
ColumnMapperPtr getColumnMapperForCurrentSchema(StorageMetadataPtr storage_metadata_snapshot, ContextPtr context) const override
{ return getImpl().getColumnMapperForCurrentSchema(storage_metadata_snapshot, context); }

Names getIdentityPartitionColumnNames(ContextPtr context) const override { return getImpl().getIdentityPartitionColumnNames(context); }

std::shared_ptr<DataLake::ICatalog> getCatalog(ContextPtr context, const StorageID & table_id) const override
{ return getImpl().getCatalog(context, table_id); }

Expand Down
2 changes: 2 additions & 0 deletions src/Storages/ObjectStorage/DataLakes/IDataLakeMetadata.h
Original file line number Diff line number Diff line change
Expand Up @@ -192,6 +192,8 @@ class IDataLakeMetadata : boost::noncopyable
virtual ColumnMapperPtr getColumnMapperForObject(ObjectInfoPtr /**/) const { return nullptr; }
virtual ColumnMapperPtr getColumnMapperForCurrentSchema(StorageMetadataPtr, ContextPtr) const { return nullptr; }

virtual Names getIdentityPartitionColumnNames(ContextPtr) const { return {}; }

virtual SinkToStoragePtr write(
SharedHeader /*sample_block*/,
const StorageID & /*table_id*/,
Expand Down
15 changes: 15 additions & 0 deletions src/Storages/ObjectStorage/DataLakes/Iceberg/IcebergMetadata.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1436,6 +1436,21 @@ ColumnMapperPtr IcebergMetadata::getColumnMapperForCurrentSchema(StorageMetadata
return persistent_components.schema_processor->getColumnMapperById(iceberg_table_state->schema_id);
}

Names IcebergMetadata::getIdentityPartitionColumnNames(ContextPtr local_context) const
{
// check getPartitionKey
auto [data_snapshot, table_state_snapshot] = getRelevantState(local_context);
auto metadata_object = getMetadataJSONObject(
table_state_snapshot.metadata_file_path,
object_storage,
persistent_components.metadata_cache,
local_context,
log,
persistent_components.metadata_compression_method,
persistent_components.table_uuid);
return getIdentityPartitionColumnsFromMetadata(metadata_object);
}

std::optional<String> IcebergMetadata::getPartitionKey(ContextPtr local_context, TableStateSnapshot actual_table_state_snapshot) const
{
auto metadata_object = getMetadataJSONObject(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,8 @@ class IcebergMetadata : public IDataLakeMetadata

ColumnMapperPtr getColumnMapperForCurrentSchema(StorageMetadataPtr storage_metadata_snapshot, ContextPtr context) const override;

Names getIdentityPartitionColumnNames(ContextPtr context) const override;

SinkToStoragePtr write(
SharedHeader sample_block,
const StorageID & table_id,
Expand Down
46 changes: 46 additions & 0 deletions src/Storages/ObjectStorage/DataLakes/Iceberg/Utils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1471,6 +1471,52 @@ std::optional<String> getPartitionKeyStringFromMetadata(Poco::JSON::Object::Ptr
return result;
}

Names getIdentityPartitionColumnsFromMetadata(Poco::JSON::Object::Ptr metadata_object)
{
// @todo refactor dupli
if (!metadata_object->has(f_partition_specs) || !metadata_object->has(f_default_spec_id))
return {};

auto partition_spec_id = metadata_object->getValue<Int64>(f_default_spec_id);
Poco::JSON::Array::Ptr partition_specs = metadata_object->getArray(f_partition_specs);
std::unordered_map<Int64, String> source_id_to_column_name;
auto [schema, current_schema_id] = parseTableSchemaV2Method(metadata_object);
auto mapper = createColumnMapper(schema)->getStorageColumnEncoding();
for (const auto & [col_name, source_id] : mapper)
source_id_to_column_name[source_id] = col_name;

Poco::JSON::Object::Ptr partition_spec;
for (size_t i = 0; i < partition_specs->size(); ++i)
{
auto spec = partition_specs->getObject(static_cast<UInt32>(i));
if (spec->getValue<Int64>(f_spec_id) == partition_spec_id)
{
partition_spec = spec;
break;
}
}

if (!partition_spec || !partition_spec->has(f_fields))
return {};

auto fields = partition_spec->getArray(f_fields);
if (fields->size() == 0)
return {};

Names result;
std::vector<String> part_exprs;
for (UInt32 i = 0; i < fields->size(); ++i)
{
auto field = fields->getObject(i);
if (field->getValue<String>(f_transform) != "identity")
continue;

if (auto it = source_id_to_column_name.find(field->getValue<Int64>(f_source_id)); it != source_id_to_column_name.end())
result.push_back(it->second);
}
return result;
}

std::optional<String> getSortingKeyDisplayStringFromMetadata(Poco::JSON::Object::Ptr metadata_object, const NamesAndTypesList & /* ch_schema */)
{
if (!metadata_object->has(f_sort_orders) || !metadata_object->has(f_default_sort_order_id))
Expand Down
1 change: 1 addition & 0 deletions src/Storages/ObjectStorage/DataLakes/Iceberg/Utils.h
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,7 @@ std::optional<String> getSortingKeyDisplayStringFromMetadata(
Poco::JSON::Object::Ptr metadata_object, const NamesAndTypesList & ch_schema);
std::optional<String> getPartitionKeyStringFromMetadata(
Poco::JSON::Object::Ptr metadata_object, const NamesAndTypesList & ch_schema, ContextPtr local_context);
Names getIdentityPartitionColumnsFromMetadata(Poco::JSON::Object::Ptr metadata_object);
void sortBlockByKeyDescription(Block & block, const KeyDescription & sort_description, ContextPtr context);
}

Expand Down
25 changes: 24 additions & 1 deletion src/Storages/ObjectStorage/StorageObjectStorage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

#include <Common/Exception.h>
#include <Common/Logger.h>
#include <Common/UniqueLock.h>
#include <Common/logger_useful.h>
#include <Core/Settings.h>
#include <Formats/FormatFactory.h>
Expand Down Expand Up @@ -336,7 +337,21 @@ bool StorageObjectStorage::canMoveConditionsToPrewhere() const

std::optional<NameSet> StorageObjectStorage::supportedPrewhereColumns() const
{
return getInMemoryMetadataPtr()->getColumnsWithoutDefaultExpressions(/*exclude=*/ hive_partition_columns_to_read_from_file_path);
auto exclude = hive_partition_columns_to_read_from_file_path;

const auto & cols = getInMemoryMetadataPtr()->getColumns();
{
SharedLockGuard lock(mutex_file_constant_columns);
for (const auto & col : file_constant_columns)
{
if (getInMemoryMetadataPtr()->getColumns().has(col))
// tryGetColumn
exclude.emplace_back(col, cols.get(col).type);
}
}

LOG_DEBUG(log, "Prewhere exclude list: [{}]", exclude.toString());
return getInMemoryMetadataPtr()->getColumnsWithoutDefaultExpressions(/*exclude=*/exclude);
}

IStorage::ColumnSizeByName StorageObjectStorage::getColumnSizes() const
Expand All @@ -354,6 +369,12 @@ configuration->update(object_storage, query_context);
return configuration->getExternalMetadata();
}

void StorageObjectStorage::updateFileConstantColumns(ContextPtr query_context)
{
UniqueLock lock(mutex_file_constant_columns);
file_constant_columns = configuration->getIdentityPartitionColumnNames(query_context);
}

void StorageObjectStorage::updateExternalDynamicMetadataIfExists(ContextPtr query_context)
{
if (!configuration->isDataLakeConfiguration())
Expand Down Expand Up @@ -381,6 +402,8 @@ void StorageObjectStorage::updateExternalDynamicMetadataIfExists(ContextPtr quer
new_metadata = *metadata_snapshot;
}

updateFileConstantColumns(query_context);

setInMemoryMetadata(new_metadata);
}

Expand Down
4 changes: 4 additions & 0 deletions src/Storages/ObjectStorage/StorageObjectStorage.h
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,7 @@ class StorageObjectStorage : public IStorage

void addInferredEngineArgsToCreateQuery(ASTs & args, const ContextPtr & context) const override;

void updateFileConstantColumns(ContextPtr query_context);
void updateExternalDynamicMetadataIfExists(ContextPtr query_context) override;

IDataLakeMetadata * getExternalMetadata(ContextPtr query_context);
Expand Down Expand Up @@ -214,6 +215,9 @@ class StorageObjectStorage : public IStorage
NamesAndTypesList hive_partition_columns_to_read_from_file_path;
NamesAndTypesList file_columns;

mutable SharedMutex mutex_file_constant_columns;
Names file_constant_columns TSA_GUARDED_BY(mutex_file_constant_columns);

LoggerPtr log;

std::shared_ptr<DataLake::ICatalog> catalog;
Expand Down
3 changes: 3 additions & 0 deletions src/Storages/ObjectStorage/StorageObjectStorageCluster.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -569,7 +569,10 @@ void StorageObjectStorageCluster::updateExternalDynamicMetadataIfExists(ContextP
setInMemoryMetadata(new_metadata);

if (pure_storage)
{
pure_storage->setInMemoryMetadata(IStorageCluster::getInMemoryMetadata());
pure_storage->updateFileConstantColumns(query_context);
}
}

class TaskDistributor : public TaskIterator
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -312,6 +312,7 @@ class StorageObjectStorageConfiguration

virtual ColumnMapperPtr getColumnMapperForCurrentSchema(StorageMetadataPtr /**/, ContextPtr /**/) const { return nullptr; }

virtual Names getIdentityPartitionColumnNames(ContextPtr) const { return {}; }

virtual std::shared_ptr<DataLake::ICatalog> getCatalog(ContextPtr /*context*/, const StorageID & /*table_id*/) const
{
Expand Down
Loading