Skip to content

Commit 51cec29

Browse files
authored
Nested column partition support in HudiPartitionValuesExtractor when hive style partitioning is enabled (#738)
1 parent 0adb8d3 commit 51cec29

2 files changed

Lines changed: 86 additions & 3 deletions

File tree

xtable-core/src/main/java/org/apache/xtable/hudi/HudiPartitionValuesExtractor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ public List<PartitionValue> extractPartitionValues(
5353
List<PartitionValue> result = new ArrayList<>(totalNumberOfPartitions);
5454
String remainingPartitionPath = partitionPath;
5555
for (InternalPartitionField partitionField : partitionColumns) {
56-
String sourceFieldName = partitionField.getSourceField().getName();
56+
String sourceFieldName = partitionField.getSourceField().getPath();
5757
if (remainingPartitionPath.startsWith(sourceFieldName + "=")) {
5858
// Strip off hive style partitioning
5959
remainingPartitionPath = remainingPartitionPath.substring(sourceFieldName.length() + 1);

xtable-core/src/test/java/org/apache/xtable/hudi/TestHudiPartitionValuesExtractor.java

Lines changed: 85 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
import java.util.HashMap;
2525
import java.util.List;
2626
import java.util.Map;
27+
import java.util.stream.Collectors;
28+
import java.util.stream.IntStream;
2729
import java.util.stream.Stream;
2830

2931
import org.junit.jupiter.api.Assertions;
@@ -32,6 +34,8 @@
3234
import org.junit.jupiter.params.provider.Arguments;
3335
import org.junit.jupiter.params.provider.MethodSource;
3436

37+
import com.google.common.base.Strings;
38+
3539
import org.apache.xtable.exception.PartitionValuesExtractorException;
3640
import org.apache.xtable.model.schema.InternalField;
3741
import org.apache.xtable.model.schema.InternalPartitionField;
@@ -43,6 +47,12 @@
4347

4448
public class TestHudiPartitionValuesExtractor {
4549

50+
private static final InternalSchema INT_SCHEMA =
51+
InternalSchema.builder().name("int").dataType(InternalType.INT).build();
52+
53+
private static final InternalSchema STRING_SCHEMA =
54+
InternalSchema.builder().name("string").dataType(InternalType.STRING).build();
55+
4656
@Test
4757
public void testSingleColumn() {
4858
InternalPartitionField column =
@@ -366,7 +376,6 @@ public void testHiveStyle() {
366376
.sourceField(
367377
InternalField.builder()
368378
.name("column2")
369-
.parentPath("base")
370379
.schema(
371380
InternalSchema.builder().name("long").dataType(InternalType.LONG).build())
372381
.build())
@@ -404,7 +413,6 @@ public void testHiveStyleWithDefaultPartition() {
404413
.sourceField(
405414
InternalField.builder()
406415
.name("column2")
407-
.parentPath("base")
408416
.schema(
409417
InternalSchema.builder().name("long").dataType(InternalType.LONG).build())
410418
.build())
@@ -498,4 +506,79 @@ public void testPartitionFormatMismatch() {
498506
new HudiPartitionValuesExtractor(pathToPartitionFieldFormat)
499507
.extractPartitionValues(Collections.singletonList(column), "2022-10-02"));
500508
}
509+
510+
static Stream<Arguments> nestedColumnPartitioning_testArgs() {
511+
InternalPartitionField p1 = createSimplePartitionField("year", "partition.date", INT_SCHEMA);
512+
InternalPartitionField p2 = createSimplePartitionField("month", "partition.date", INT_SCHEMA);
513+
InternalPartitionField p3 = createSimplePartitionField("day", "partition.date", INT_SCHEMA);
514+
InternalPartitionField p4 = createSimplePartitionField("country", null, STRING_SCHEMA);
515+
516+
return Stream.of(
517+
// nested column partition, hive style enabled
518+
Arguments.of(
519+
Collections.singletonList(p1),
520+
Collections.singletonList(Range.scalar(2022)),
521+
"partition.date.year=2022"),
522+
Arguments.of(
523+
Arrays.asList(p1, p2),
524+
Arrays.asList(Range.scalar(2022), Range.scalar(10)),
525+
"partition.date.year=2022/partition.date.month=10"),
526+
Arguments.of(
527+
Arrays.asList(p1, p2, p3),
528+
Arrays.asList(Range.scalar(2022), Range.scalar(10), Range.scalar(2)),
529+
"partition.date.year=2022/partition.date.month=10/partition.date.day=2"),
530+
Arguments.of(
531+
Arrays.asList(p1, p4),
532+
Arrays.asList(Range.scalar(2022), Range.scalar("US")),
533+
"partition.date.year=2022/country=US"),
534+
535+
// nested column partition, hive style disabled
536+
Arguments.of(
537+
Collections.singletonList(p1), Collections.singletonList(Range.scalar(2022)), "2022"),
538+
Arguments.of(
539+
Arrays.asList(p1, p2), Arrays.asList(Range.scalar(2022), Range.scalar(10)), "2022/10"),
540+
Arguments.of(
541+
Arrays.asList(p1, p2, p3),
542+
Arrays.asList(Range.scalar(2022), Range.scalar(10), Range.scalar(2)),
543+
"2022/10/2"),
544+
Arguments.of(
545+
Arrays.asList(p1, p4),
546+
Arrays.asList(Range.scalar(2022), Range.scalar("US")),
547+
"2022/US"));
548+
}
549+
550+
@ParameterizedTest
551+
@MethodSource("nestedColumnPartitioning_testArgs")
552+
void testNestedColumnPartitioning(
553+
List<InternalPartitionField> partitionFields,
554+
List<Range> partitionRanges,
555+
String partitionPath) {
556+
List<PartitionValue> expected =
557+
IntStream.range(0, partitionFields.size())
558+
.mapToObj(
559+
i ->
560+
PartitionValue.builder()
561+
.partitionField(partitionFields.get(i))
562+
.range(partitionRanges.get(i))
563+
.build())
564+
.collect(Collectors.toList());
565+
566+
List<PartitionValue> actual =
567+
new HudiPartitionValuesExtractor(Collections.emptyMap())
568+
.extractPartitionValues(partitionFields, partitionPath);
569+
Assertions.assertEquals(expected, actual);
570+
}
571+
572+
private static InternalPartitionField createSimplePartitionField(
573+
String name, String parentPath, InternalSchema schema) {
574+
InternalField.InternalFieldBuilder sourceFieldBuilder =
575+
InternalField.builder().name(name).schema(schema);
576+
if (!Strings.isNullOrEmpty(parentPath)) {
577+
sourceFieldBuilder.parentPath(parentPath);
578+
}
579+
return InternalPartitionField.builder()
580+
.sourceField(sourceFieldBuilder.build())
581+
.transformType(PartitionTransformType.VALUE)
582+
.build();
583+
}
501584
}

0 commit comments

Comments
 (0)