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 <[email protected]>
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()

Reply via email to