All Downloads are FREE. Search and download functionalities are using the official Maven repository.
Please wait. This can take some minutes ...
Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance.
Project price only 1 $
You can buy this project and download/modify it how often you want.
io.trino.plugin.hudi.HudiSplitManager Maven / Gradle / Ivy
/*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.trino.plugin.hudi;
import com.google.common.collect.ImmutableList;
import com.google.inject.Inject;
import io.trino.filesystem.TrinoFileSystemFactory;
import io.trino.metastore.HiveMetastore;
import io.trino.metastore.Table;
import io.trino.plugin.base.classloader.ClassLoaderSafeConnectorSplitSource;
import io.trino.plugin.hive.HiveColumnHandle;
import io.trino.plugin.hive.HiveTransactionHandle;
import io.trino.spi.connector.ConnectorSession;
import io.trino.spi.connector.ConnectorSplitManager;
import io.trino.spi.connector.ConnectorSplitSource;
import io.trino.spi.connector.ConnectorTableHandle;
import io.trino.spi.connector.ConnectorTransactionHandle;
import io.trino.spi.connector.Constraint;
import io.trino.spi.connector.DynamicFilter;
import io.trino.spi.connector.TableNotFoundException;
import io.trino.spi.security.ConnectorIdentity;
import io.trino.spi.type.TypeManager;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ScheduledExecutorService;
import java.util.function.BiFunction;
import java.util.stream.Collectors;
import static com.google.common.collect.ImmutableMap.toImmutableMap;
import static io.trino.plugin.hive.metastore.MetastoreUtil.computePartitionKeyFilter;
import static io.trino.plugin.hive.util.HiveUtil.getPartitionKeyColumnHandles;
import static io.trino.plugin.hudi.HudiSessionProperties.getMaxOutstandingSplits;
import static io.trino.plugin.hudi.HudiSessionProperties.getMaxSplitsPerSecond;
import static io.trino.plugin.hudi.partition.HiveHudiPartitionInfo.NON_PARTITION;
import static io.trino.spi.connector.SchemaTableName.schemaTableName;
import static java.util.Objects.requireNonNull;
import static java.util.function.Function.identity;
public class HudiSplitManager
implements ConnectorSplitManager
{
private final TypeManager typeManager;
private final BiFunction metastoreProvider;
private final TrinoFileSystemFactory fileSystemFactory;
private final ExecutorService executor;
private final ScheduledExecutorService splitLoaderExecutorService;
@Inject
public HudiSplitManager(
TypeManager typeManager,
BiFunction metastoreProvider,
@ForHudiSplitManager ExecutorService executor,
TrinoFileSystemFactory fileSystemFactory,
@ForHudiSplitSource ScheduledExecutorService splitLoaderExecutorService)
{
this.typeManager = requireNonNull(typeManager, "typeManager is null");
this.metastoreProvider = requireNonNull(metastoreProvider, "metastoreProvider is null");
this.executor = requireNonNull(executor, "executor is null");
this.fileSystemFactory = requireNonNull(fileSystemFactory, "fileSystemFactory is null");
this.splitLoaderExecutorService = requireNonNull(splitLoaderExecutorService, "splitLoaderExecutorService is null");
}
@Override
public ConnectorSplitSource getSplits(
ConnectorTransactionHandle transaction,
ConnectorSession session,
ConnectorTableHandle tableHandle,
DynamicFilter dynamicFilter,
Constraint constraint)
{
HudiTableHandle hudiTableHandle = (HudiTableHandle) tableHandle;
HiveMetastore metastore = metastoreProvider.apply(session.getIdentity(), (HiveTransactionHandle) transaction);
Table table = metastore.getTable(hudiTableHandle.getSchemaName(), hudiTableHandle.getTableName())
.orElseThrow(() -> new TableNotFoundException(schemaTableName(hudiTableHandle.getSchemaName(), hudiTableHandle.getTableName())));
List partitionColumns = getPartitionKeyColumnHandles(table, typeManager);
Map partitionColumnHandles = partitionColumns.stream()
.collect(toImmutableMap(HiveColumnHandle::getName, identity()));
List partitions = getPartitions(metastore, hudiTableHandle, partitionColumns);
HudiSplitSource splitSource = new HudiSplitSource(
session,
metastore,
table,
hudiTableHandle,
fileSystemFactory,
partitionColumnHandles,
executor,
splitLoaderExecutorService,
getMaxSplitsPerSecond(session),
getMaxOutstandingSplits(session),
partitions);
return new ClassLoaderSafeConnectorSplitSource(splitSource, HudiSplitManager.class.getClassLoader());
}
private static List getPartitions(HiveMetastore metastore, HudiTableHandle table, List partitionColumns)
{
if (partitionColumns.isEmpty()) {
return ImmutableList.of(NON_PARTITION);
}
return metastore.getPartitionNamesByFilter(
table.getSchemaName(),
table.getTableName(),
partitionColumns.stream().map(HiveColumnHandle::getName).collect(Collectors.toList()),
computePartitionKeyFilter(partitionColumns, table.getPartitionPredicates()))
.orElseThrow(() -> new TableNotFoundException(table.getSchemaTableName()));
}
}