public int[] partitionPage(Page partitionColumns, Block bucketBlock) { if (bucketBlock != null) { Block[] blocks = new Block[partitionColumns.getChannelCount() + 1]; for (int i = 0; i < partitionColumns.getChannelCount(); i++) { blocks[i] = partitionColumns.getBlock(i); } blocks[blocks.length - 1] = bucketBlock; partitionColumns = new Page(partitionColumns.getPositionCount(), blocks); } return pageIndexer.indexPage(partitionColumns); }
@Override public CompletableFuture<?> appendPage(Page page, Block sampleWeightBlock) { if (page.getPositionCount() == 0) { return NOT_BLOCKED; } Block[] dataBlocks = getDataBlocks(page, sampleWeightBlock); Block[] partitionBlocks = getPartitionBlocks(page); int[] indexes = pageIndexer.indexPage(new Page(page.getPositionCount(), partitionBlocks)); if (pageIndexer.getMaxIndex() >= maxOpenPartitions) { throw new PrestoException(HIVE_TOO_MANY_OPEN_PARTITIONS, "Too many open partitions"); } if (pageIndexer.getMaxIndex() >= writers.length) { writers = Arrays.copyOf(writers, pageIndexer.getMaxIndex() + 1); } for (int position = 0; position < page.getPositionCount(); position++) { int writerIndex = indexes[position]; HiveRecordWriter writer = writers[writerIndex]; if (writer == null) { for (int field = 0; field < partitionBlocks.length; field++) { Object value = getField(partitionColumnTypes.get(field), partitionBlocks[field], position); partitionRow.set(field, value); } writer = createWriter(partitionRow); writers[writerIndex] = writer; } writer.addRow(dataBlocks, position); } return NOT_BLOCKED; }