use of org.apache.drill.exec.planner.logical.DrillTable in project drill by axbaretto.
the class PruneScanRule method getDrillTable.
private static DrillTable getDrillTable(final TableScan scan) {
DrillTable drillTable;
drillTable = scan.getTable().unwrap(DrillTable.class);
if (drillTable == null) {
drillTable = scan.getTable().unwrap(DrillTranslatableTable.class).getDrillTable();
}
return drillTable;
}
use of org.apache.drill.exec.planner.logical.DrillTable in project drill by axbaretto.
the class FindHardDistributionScans method visit.
@Override
public RelNode visit(TableScan scan) {
DrillTable unwrap;
unwrap = scan.getTable().unwrap(DrillTable.class);
if (unwrap == null) {
unwrap = scan.getTable().unwrap(DrillTranslatableTable.class).getDrillTable();
}
try {
if (unwrap.getGroupScan().getDistributionAffinity() == DistributionAffinity.HARD) {
contains = true;
}
} catch (final IOException e) {
throw new DrillRuntimeException("Failed to get GroupScan from table.");
}
return scan;
}
use of org.apache.drill.exec.planner.logical.DrillTable in project drill by apache.
the class RefreshMetadataHandler method getPlan.
@Override
public PhysicalPlan getPlan(SqlNode sqlNode) throws ForemanSetupException {
final SqlRefreshMetadata refreshTable = unwrap(sqlNode, SqlRefreshMetadata.class);
try {
final SchemaPlus schema = findSchema(config.getConverter().getDefaultSchema(), refreshTable.getSchemaPath());
if (schema == null) {
return direct(false, "Storage plugin or workspace does not exist [%s]", SchemaUtilites.SCHEMA_PATH_JOINER.join(refreshTable.getSchemaPath()));
}
final String tableName = refreshTable.getName();
final SqlNodeList columnList = getColumnList(refreshTable);
final Set<SchemaPath> columnSet = getColumnRootSegments(columnList);
final SqlLiteral allColumns = refreshTable.getAllColumns();
if (tableName.contains("*") || tableName.contains("?")) {
return direct(false, "Glob path %s not supported for metadata refresh", tableName);
}
final Table table = schema.getTable(tableName);
if (table == null) {
return direct(false, "Table %s does not exist.", tableName);
}
if (!(table instanceof DrillTable)) {
return notSupported(tableName);
}
final DrillTable drillTable = (DrillTable) table;
final Object selection = drillTable.getSelection();
if (selection instanceof FileSelection && ((FileSelection) selection).isEmptyDirectory()) {
return direct(false, "Table %s is empty and doesn't contain any parquet files.", tableName);
}
if (!(selection instanceof FormatSelection)) {
return notSupported(tableName);
}
final FormatSelection formatSelection = (FormatSelection) selection;
FormatPluginConfig formatConfig = formatSelection.getFormat();
if (!((formatConfig instanceof ParquetFormatConfig) || ((formatConfig instanceof NamedFormatPluginConfig) && ((NamedFormatPluginConfig) formatConfig).getName().equals("parquet")))) {
return notSupported(tableName);
}
// Always create filesystem object using process user, since it owns the metadata file
final DrillFileSystem fs = ImpersonationUtil.createFileSystem(ImpersonationUtil.getProcessUserName(), drillTable.getPlugin().getFormatPlugin(formatConfig).getFsConf());
final Path selectionRoot = formatSelection.getSelection().getSelectionRoot();
if (!fs.getFileStatus(selectionRoot).isDirectory()) {
return notSupported(tableName);
}
if (!(formatConfig instanceof ParquetFormatConfig)) {
formatConfig = new ParquetFormatConfig();
}
final ParquetReaderConfig readerConfig = ParquetReaderConfig.builder().withFormatConfig((ParquetFormatConfig) formatConfig).withOptions(context.getOptions()).build();
Metadata.createMeta(fs, selectionRoot, readerConfig, allColumns.booleanValue(), columnSet);
return direct(true, "Successfully updated metadata for table %s.", tableName);
} catch (Exception e) {
logger.error("Failed to update metadata for table '{}'", refreshTable.getName(), e);
return DirectPlan.createDirectPlan(context, false, String.format("Error: %s", e.getMessage()));
}
}
use of org.apache.drill.exec.planner.logical.DrillTable in project drill by apache.
the class FileMetadataInfoCollector method getTableScan.
private TableScan getTableScan(PlannerSettings settings, TableScan scanRel, List<String> scanFiles) {
FileSystemPartitionDescriptor descriptor = new FileSystemPartitionDescriptor(settings, scanRel);
List<PartitionLocation> newPartitions = Lists.newArrayList(descriptor.iterator()).stream().flatMap(Collection::stream).flatMap(p -> p.getPartitionLocationRecursive().stream()).filter(p -> scanFiles.contains(p.getEntirePartitionLocation().toUri().getPath())).collect(Collectors.toList());
try {
if (!newPartitions.isEmpty()) {
return descriptor.createTableScan(newPartitions, false);
} else {
DrillTable drillTable = descriptor.getTable();
SchemalessScan scan = new SchemalessScan(drillTable.getUserName(), ((FormatSelection) descriptor.getTable().getSelection()).getSelection().getSelectionRoot());
return new DrillScanRel(scanRel.getCluster(), scanRel.getTraitSet().plus(DrillRel.DRILL_LOGICAL), scanRel.getTable(), scan, scanRel.getRowType(), DrillScanRel.getProjectedColumns(scanRel.getTable(), true), true);
}
} catch (Exception e) {
throw new RuntimeException("Error happened during recreation of pruned scan", e);
}
}
use of org.apache.drill.exec.planner.logical.DrillTable in project drill by apache.
the class DrillIndexDescriptor method getIndexGroupScan.
@Override
public IndexGroupScan getIndexGroupScan() {
try {
final DrillTable idxTable = getDrillTable();
GroupScan scan = idxTable.getGroupScan();
if (!(scan instanceof IndexGroupScan)) {
logger.error("The Groupscan from table {} is not an IndexGroupScan", idxTable.toString());
return null;
}
return (IndexGroupScan) scan;
} catch (IOException e) {
logger.error("Error in getIndexGroupScan ", e);
}
return null;
}
Aggregations