You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xtable.apache.org by vi...@apache.org on 2026/10/23 05:18:26 UTC

(incubator-xtable) branch main updated: fix(spark-runtime): Support Parquet source partitioning (#927) (#931)

This is an automated email from the ASF dual-hosted git repository.

vinishjail97 pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-xtable.git


The following commit(s) were added to refs/heads/main by this push:
     new d34a37a0 fix(spark-runtime): Support Parquet source partitioning (#927) (#931)
d34a37a0 is described below

commit d34a37a0eb4bacb41ef37bb699a37704cfae2d7d
Author: Arvin <31...@users.noreply.github.com>
AuthorDate: Fri Oct 23 13:18:20 2026 +0800

    fix(spark-runtime): Support Parquet source partitioning (#927) (#931)
    
    * [Bug] Route partition spec to source-format-specific config key (#927)
    
    * fix: add @Builder.Default for initialized fields in conversion sources
    
    * fix: apply spotless formatting to XTableSparkSync.java
---
 .../main/java/org/apache/xtable/delta/DeltaConversionSource.java  | 1 +
 .../org/apache/xtable/kernel/DeltaKernelConversionSource.java     | 1 +
 .../src/main/java/org/apache/xtable/spark/TableSyncSpec.java      | 6 +++++-
 .../src/main/java/org/apache/xtable/spark/XTableSparkSync.java    | 3 ++-
 .../src/main/java/org/apache/xtable/spark/XTableSyncService.java  | 8 +++++++-
 5 files changed, 16 insertions(+), 3 deletions(-)

diff --git a/xtable-core/src/main/java/org/apache/xtable/delta/DeltaConversionSource.java b/xtable-core/src/main/java/org/apache/xtable/delta/DeltaConversionSource.java
index fc1d17c6..2a6f8958 100644
--- a/xtable-core/src/main/java/org/apache/xtable/delta/DeltaConversionSource.java
+++ b/xtable-core/src/main/java/org/apache/xtable/delta/DeltaConversionSource.java
@@ -73,6 +73,7 @@ public class DeltaConversionSource implements ConversionSource<Long> {
   @Builder.Default
   private final DeltaTableExtractor tableExtractor = DeltaTableExtractor.builder().build();
 
+  @Builder.Default
   private Optional<DeltaIncrementalChangesState> deltaIncrementalChangesState = Optional.empty();
 
   private final SparkSession sparkSession;
diff --git a/xtable-core/src/main/java/org/apache/xtable/kernel/DeltaKernelConversionSource.java b/xtable-core/src/main/java/org/apache/xtable/kernel/DeltaKernelConversionSource.java
index 14241f92..ca0f4b94 100644
--- a/xtable-core/src/main/java/org/apache/xtable/kernel/DeltaKernelConversionSource.java
+++ b/xtable-core/src/main/java/org/apache/xtable/kernel/DeltaKernelConversionSource.java
@@ -74,6 +74,7 @@ public class DeltaKernelConversionSource implements ConversionSource<Long> {
   private final DeltaKernelTableExtractor tableExtractor =
       DeltaKernelTableExtractor.builder().build();
 
+  @Builder.Default
   private Optional<DeltaKernelIncrementalChangesState> deltaKernelIncrementalChangesState =
       Optional.empty();
 
diff --git a/xtable-spark-runtime/src/main/java/org/apache/xtable/spark/TableSyncSpec.java b/xtable-spark-runtime/src/main/java/org/apache/xtable/spark/TableSyncSpec.java
index 75d35a32..4aeb4daa 100644
--- a/xtable-spark-runtime/src/main/java/org/apache/xtable/spark/TableSyncSpec.java
+++ b/xtable-spark-runtime/src/main/java/org/apache/xtable/spark/TableSyncSpec.java
@@ -40,7 +40,11 @@ public class TableSyncSpec {
   /** Optional namespace segments for the table. */
   String[] namespace;
 
-  /** Optional partition spec for a partitioned Hudi source, e.g. {@code level:VALUE}. */
+  /**
+   * Optional source partition spec (e.g. {@code level:VALUE}); applies to partitioned Hudi and
+   * Parquet sources. Maps to {@code xtable.hudi.source.partition_field_spec_config} for Hudi and
+   * {@code xtable.parquet.source.partition_field_spec_config} for Parquet.
+   */
   String partitionSpec;
 
   /** The source table format, e.g. {@code HUDI} (see {@code TableFormat}). */
diff --git a/xtable-spark-runtime/src/main/java/org/apache/xtable/spark/XTableSparkSync.java b/xtable-spark-runtime/src/main/java/org/apache/xtable/spark/XTableSparkSync.java
index 84a8b863..cf2f7877 100644
--- a/xtable-spark-runtime/src/main/java/org/apache/xtable/spark/XTableSparkSync.java
+++ b/xtable-spark-runtime/src/main/java/org/apache/xtable/spark/XTableSparkSync.java
@@ -153,7 +153,8 @@ public final class XTableSparkSync {
               Option.builder()
                   .longOpt(PARTITION_SPEC)
                   .hasArg()
-                  .desc("The Hudi source partition field spec, e.g. level:VALUE")
+                  .desc(
+                      "The source partition field spec, e.g. level:VALUE (Hudi and Parquet sources)")
                   .build())
           .addOption(
               Option.builder()
diff --git a/xtable-spark-runtime/src/main/java/org/apache/xtable/spark/XTableSyncService.java b/xtable-spark-runtime/src/main/java/org/apache/xtable/spark/XTableSyncService.java
index 43eb720a..e875dab7 100644
--- a/xtable-spark-runtime/src/main/java/org/apache/xtable/spark/XTableSyncService.java
+++ b/xtable-spark-runtime/src/main/java/org/apache/xtable/spark/XTableSyncService.java
@@ -44,6 +44,7 @@ import org.apache.xtable.model.sync.SyncMode;
 import org.apache.xtable.model.sync.SyncResult;
 import org.apache.xtable.paimon.PaimonConversionSourceProvider;
 import org.apache.xtable.parquet.ParquetConversionSourceProvider;
+import org.apache.xtable.parquet.ParquetSourceConfig;
 
 /**
  * Runs an incremental {@link ConversionController#sync} for a {@link TableSyncSpec}. The sync falls
@@ -57,7 +58,12 @@ public class XTableSyncService {
   public Map<String, SyncResult> sync(TableSyncSpec spec, Configuration hadoopConf) {
     Properties sourceProperties = new Properties();
     if (spec.getPartitionSpec() != null && !spec.getPartitionSpec().isEmpty()) {
-      sourceProperties.put(HudiSourceConfig.PARTITION_FIELD_SPEC_CONFIG, spec.getPartitionSpec());
+      if (TableFormat.PARQUET.equals(spec.getSourceFormat())) {
+        sourceProperties.put(
+            ParquetSourceConfig.PARTITION_FIELD_SPEC_CONFIG, spec.getPartitionSpec());
+      } else {
+        sourceProperties.put(HudiSourceConfig.PARTITION_FIELD_SPEC_CONFIG, spec.getPartitionSpec());
+      }
     }
     String dataPath =
         spec.getDataPath() != null && !spec.getDataPath().isEmpty()