You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iceberg.apache.org by bl...@apache.org on 2021/10/19 15:15:42 UTC

[iceberg] branch master updated: Spark: Remove common module, iceberg-spark (#3313)

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

blue pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iceberg.git


The following commit(s) were added to refs/heads/master by this push:
     new f3e6770  Spark: Remove common module, iceberg-spark (#3313)
f3e6770 is described below

commit f3e6770c0506a13c067f506dad266d043819d446
Author: Anton Okolnychyi <ao...@apple.com>
AuthorDate: Tue Oct 19 08:15:34 2021 -0700

    Spark: Remove common module, iceberg-spark (#3313)
    
    This also fixes some instances of source incompatibility in Spark 3
---
 jmh.gradle                                         |  8 ---
 spark/build.gradle                                 | 66 ----------------------
 spark/v2.4/build.gradle                            | 17 +++++-
 .../apache/iceberg/spark/SparkBenchmarkUtil.java   |  0
 .../SparkParquetReadersFlatDataBenchmark.java      |  0
 .../SparkParquetReadersNestedDataBenchmark.java    |  0
 .../SparkParquetWritersFlatDataBenchmark.java      |  0
 .../SparkParquetWritersNestedDataBenchmark.java    |  0
 .../org/apache/iceberg/spark/source/Action.java    |  0
 .../spark/source/IcebergSourceBenchmark.java       |  0
 .../source/IcebergSourceFlatDataBenchmark.java     |  0
 .../source/IcebergSourceNestedDataBenchmark.java   |  0
 .../IcebergSourceNestedListDataBenchmark.java      |  0
 .../iceberg/spark/source/WritersBenchmark.java     |  0
 .../spark/source/avro/AvroWritersBenchmark.java    |  0
 .../IcebergSourceFlatAvroDataReadBenchmark.java    |  0
 .../IcebergSourceNestedAvroDataReadBenchmark.java  |  0
 .../orc/IcebergSourceFlatORCDataBenchmark.java     |  0
 .../orc/IcebergSourceFlatORCDataReadBenchmark.java |  0
 ...ebergSourceNestedListORCDataWriteBenchmark.java |  0
 .../IcebergSourceNestedORCDataReadBenchmark.java   |  0
 ...cebergSourceFlatParquetDataFilterBenchmark.java |  0
 .../IcebergSourceFlatParquetDataReadBenchmark.java |  0
 ...IcebergSourceFlatParquetDataWriteBenchmark.java |  0
 ...gSourceNestedListParquetDataWriteBenchmark.java |  0
 ...bergSourceNestedParquetDataFilterBenchmark.java |  0
 ...cebergSourceNestedParquetDataReadBenchmark.java |  0
 ...ebergSourceNestedParquetDataWriteBenchmark.java |  0
 .../source/parquet/ParquetWritersBenchmark.java    |  0
 ...dDictionaryEncodedFlatParquetDataBenchmark.java |  0
 .../VectorizedReadFlatParquetDataBenchmark.java    |  0
 .../java/org/apache/iceberg/actions/Actions.java   |  0
 .../org/apache/iceberg/actions/CreateAction.java   |  0
 .../iceberg/actions/ExpireSnapshotsAction.java     |  0
 .../actions/ExpireSnapshotsActionResult.java       |  0
 .../apache/iceberg/actions/ManifestFileBean.java   |  0
 .../iceberg/actions/RemoveOrphanFilesAction.java   |  0
 .../iceberg/actions/RewriteDataFilesAction.java    |  0
 .../iceberg/actions/RewriteManifestsAction.java    |  0
 .../actions/RewriteManifestsActionResult.java      |  0
 .../org/apache/iceberg/actions/SnapshotAction.java |  0
 .../org/apache/iceberg/spark/IcebergSpark.java     |  0
 .../org/apache/iceberg/spark/JobGroupInfo.java     |  0
 .../org/apache/iceberg/spark/JobGroupUtils.java    |  0
 .../iceberg/spark/PruneColumnsWithReordering.java  |  0
 .../spark/PruneColumnsWithoutReordering.java       |  0
 .../org/apache/iceberg/spark/SparkConfParser.java  |  0
 .../org/apache/iceberg/spark/SparkDataFile.java    |  0
 .../apache/iceberg/spark/SparkExceptionUtil.java   |  0
 .../iceberg/spark/SparkFixupTimestampType.java     |  0
 .../org/apache/iceberg/spark/SparkFixupTypes.java  |  0
 .../org/apache/iceberg/spark/SparkReadConf.java    |  0
 .../org/apache/iceberg/spark/SparkReadOptions.java |  0
 .../apache/iceberg/spark/SparkSQLProperties.java   |  0
 .../org/apache/iceberg/spark/SparkSchemaUtil.java  |  0
 .../org/apache/iceberg/spark/SparkStructLike.java  |  0
 .../org/apache/iceberg/spark/SparkTableUtil.java   |  0
 .../org/apache/iceberg/spark/SparkTypeToType.java  |  0
 .../org/apache/iceberg/spark/SparkTypeVisitor.java |  0
 .../java/org/apache/iceberg/spark/SparkUtil.java   |  0
 .../apache/iceberg/spark/SparkValueConverter.java  |  0
 .../org/apache/iceberg/spark/SparkWriteConf.java   |  0
 .../apache/iceberg/spark/SparkWriteOptions.java    |  0
 .../org/apache/iceberg/spark/TypeToSparkType.java  |  0
 .../actions/BaseDeleteOrphanFilesSparkAction.java  |  0
 .../BaseDeleteReachableFilesSparkAction.java       |  0
 .../actions/BaseExpireSnapshotsSparkAction.java    |  0
 .../actions/BaseRewriteDataFilesSparkAction.java   |  0
 .../actions/BaseRewriteManifestsSparkAction.java   |  0
 .../actions/BaseSnapshotUpdateSparkAction.java     |  0
 .../iceberg/spark/actions/BaseSparkAction.java     |  0
 .../iceberg/spark/actions/BaseSparkActions.java    |  0
 .../spark/data/AvroWithSparkSchemaVisitor.java     |  0
 .../spark/data/ParquetWithSparkSchemaVisitor.java  |  0
 .../apache/iceberg/spark/data/SparkAvroReader.java |  0
 .../apache/iceberg/spark/data/SparkAvroWriter.java |  0
 .../apache/iceberg/spark/data/SparkOrcReader.java  |  0
 .../iceberg/spark/data/SparkOrcValueReaders.java   |  0
 .../iceberg/spark/data/SparkOrcValueWriters.java   |  0
 .../apache/iceberg/spark/data/SparkOrcWriter.java  |  0
 .../iceberg/spark/data/SparkParquetReaders.java    |  0
 .../iceberg/spark/data/SparkParquetWriters.java    |  0
 .../iceberg/spark/data/SparkValueReaders.java      |  0
 .../iceberg/spark/data/SparkValueWriters.java      |  0
 .../vectorized/ArrowVectorAccessorFactory.java     |  0
 .../data/vectorized/ArrowVectorAccessors.java      |  0
 .../spark/data/vectorized/ColumnarBatchReader.java |  0
 .../data/vectorized/ConstantColumnVector.java      |  0
 .../data/vectorized/IcebergArrowColumnVector.java  |  0
 .../data/vectorized/RowPositionColumnVector.java   |  0
 .../data/vectorized/VectorizedSparkOrcReaders.java |  0
 .../vectorized/VectorizedSparkParquetReaders.java  |  0
 .../iceberg/spark/source/BaseDataReader.java       |  0
 .../iceberg/spark/source/BatchDataReader.java      |  0
 .../spark/source/EqualityDeleteRowReader.java      |  0
 .../iceberg/spark/source/InternalRowWrapper.java   |  0
 .../apache/iceberg/spark/source/RowDataReader.java |  0
 .../iceberg/spark/source/RowDataRewriter.java      |  0
 .../iceberg/spark/source/SparkAppenderFactory.java |  0
 .../spark/source/SparkFileWriterFactory.java       |  0
 .../spark/source/SparkPartitionedFanoutWriter.java |  0
 .../spark/source/SparkPartitionedWriter.java       |  0
 .../iceberg/spark/source/StructInternalRow.java    |  0
 .../test/java/org/apache/iceberg/KryoHelpers.java  |  0
 .../java/org/apache/iceberg/TaskCheckHelper.java   |  0
 .../apache/iceberg/TestDataFileSerialization.java  |  0
 .../apache/iceberg/TestFileIOSerialization.java    |  0
 .../iceberg/TestManifestFileSerialization.java     |  0
 .../apache/iceberg/TestScanTaskSerialization.java  |  0
 .../org/apache/iceberg/TestTableSerialization.java |  0
 .../actions/TestDeleteReachableFilesAction.java    |  0
 .../iceberg/actions/TestExpireSnapshotsAction.java |  0
 .../actions/TestRemoveOrphanFilesAction.java       |  0
 .../actions/TestRewriteDataFilesAction.java        |  0
 .../actions/TestRewriteManifestsAction.java        |  0
 .../org/apache/iceberg/spark/SparkTestBase.java    |  0
 .../apache/iceberg/spark/TestSparkSchemaUtil.java  |  0
 .../actions/TestNewRewriteDataFilesAction.java     |  0
 .../apache/iceberg/spark/data/AvroDataTest.java    |  0
 .../apache/iceberg/spark/data/GenericsHelpers.java |  0
 .../org/apache/iceberg/spark/data/RandomData.java  |  0
 .../org/apache/iceberg/spark/data/TestHelpers.java |  0
 .../apache/iceberg/spark/data/TestOrcWrite.java    |  0
 .../iceberg/spark/data/TestParquetAvroReader.java  |  0
 .../iceberg/spark/data/TestParquetAvroWriter.java  |  0
 .../iceberg/spark/data/TestSparkAvroEnums.java     |  0
 .../iceberg/spark/data/TestSparkAvroReader.java    |  0
 .../iceberg/spark/data/TestSparkDateTimes.java     |  0
 .../data/TestSparkOrcReadMetadataColumns.java      |  0
 .../iceberg/spark/data/TestSparkOrcReader.java     |  0
 .../data/TestSparkParquetReadMetadataColumns.java  |  0
 .../iceberg/spark/data/TestSparkParquetReader.java |  0
 .../iceberg/spark/data/TestSparkParquetWriter.java |  0
 .../spark/data/TestSparkRecordOrcReaderWriter.java |  0
 ...estParquetDictionaryEncodedVectorizedReads.java |  0
 ...naryFallbackToPlainEncodingVectorizedReads.java |  0
 .../vectorized/TestParquetVectorizedReads.java     |  0
 .../apache/iceberg/spark/source/LogMessage.java    |  0
 .../apache/iceberg/spark/source/SimpleRecord.java  |  0
 .../apache/iceberg/spark/source/TestAvroScan.java  |  0
 .../iceberg/spark/source/TestDataFrameWrites.java  |  0
 .../spark/source/TestDataSourceOptions.java        |  0
 .../spark/source/TestForwardCompatibility.java     |  0
 .../source/TestIcebergSourceHadoopTables.java      |  0
 .../spark/source/TestIcebergSourceHiveTables.java  |  0
 .../spark/source/TestIcebergSourceTablesBase.java  |  0
 .../iceberg/spark/source/TestIcebergSpark.java     |  0
 .../spark/source/TestIdentityPartitionData.java    |  0
 .../spark/source/TestInternalRowWrapper.java       |  0
 .../iceberg/spark/source/TestParquetScan.java      |  0
 .../iceberg/spark/source/TestPartitionPruning.java |  0
 .../iceberg/spark/source/TestPartitionValues.java  |  0
 .../iceberg/spark/source/TestReadProjection.java   |  0
 .../spark/source/TestSnapshotSelection.java        |  0
 .../spark/source/TestSparkAppenderFactory.java     |  0
 .../spark/source/TestSparkBaseDataReader.java      |  0
 .../iceberg/spark/source/TestSparkDataFile.java    |  0
 .../iceberg/spark/source/TestSparkDataWrite.java   |  0
 .../spark/source/TestSparkFileWriterFactory.java   |  0
 .../spark/source/TestSparkMergingMetrics.java      |  0
 .../spark/source/TestSparkPartitioningWriters.java |  0
 .../source/TestSparkPositionDeltaWriters.java      |  0
 .../spark/source/TestSparkReadProjection.java      |  0
 .../spark/source/TestSparkReaderDeletes.java       |  0
 .../spark/source/TestSparkRollingFileWriters.java  |  0
 .../iceberg/spark/source/TestSparkSchema.java      |  0
 .../spark/source/TestSparkWriterMetrics.java       |  0
 .../spark/source/TestStructuredStreaming.java      |  0
 .../apache/iceberg/spark/source/TestTables.java    |  0
 .../spark/source/TestTimestampWithoutZone.java     |  0
 .../spark/source/TestWriteMetricsConfig.java       |  0
 .../iceberg/spark/source/ThreeColumnRecord.java    |  0
 spark/v3.0/build.gradle                            | 13 ++++-
 .../apache/iceberg/spark/SparkBenchmarkUtil.java   |  0
 .../SparkParquetReadersFlatDataBenchmark.java      |  0
 .../SparkParquetReadersNestedDataBenchmark.java    |  0
 .../SparkParquetWritersFlatDataBenchmark.java      |  0
 .../SparkParquetWritersNestedDataBenchmark.java    |  0
 .../org/apache/iceberg/spark/source/Action.java    |  0
 .../spark/source/IcebergSourceBenchmark.java       |  0
 .../source/IcebergSourceFlatDataBenchmark.java     |  0
 .../source/IcebergSourceNestedDataBenchmark.java   |  0
 .../IcebergSourceNestedListDataBenchmark.java      |  0
 .../iceberg/spark/source/WritersBenchmark.java     |  0
 .../spark/source/avro/AvroWritersBenchmark.java    |  0
 .../IcebergSourceFlatAvroDataReadBenchmark.java    |  0
 .../IcebergSourceNestedAvroDataReadBenchmark.java  |  0
 .../orc/IcebergSourceFlatORCDataBenchmark.java     |  0
 .../orc/IcebergSourceFlatORCDataReadBenchmark.java |  0
 ...ebergSourceNestedListORCDataWriteBenchmark.java |  0
 .../IcebergSourceNestedORCDataReadBenchmark.java   |  0
 ...cebergSourceFlatParquetDataFilterBenchmark.java |  0
 .../IcebergSourceFlatParquetDataReadBenchmark.java |  0
 ...IcebergSourceFlatParquetDataWriteBenchmark.java |  0
 ...gSourceNestedListParquetDataWriteBenchmark.java |  0
 ...bergSourceNestedParquetDataFilterBenchmark.java |  0
 ...cebergSourceNestedParquetDataReadBenchmark.java |  0
 ...ebergSourceNestedParquetDataWriteBenchmark.java |  0
 .../source/parquet/ParquetWritersBenchmark.java    |  0
 ...dDictionaryEncodedFlatParquetDataBenchmark.java |  0
 .../VectorizedReadFlatParquetDataBenchmark.java    |  0
 .../java/org/apache/iceberg/actions/Actions.java   |  0
 .../org/apache/iceberg/actions/CreateAction.java   |  0
 .../iceberg/actions/ExpireSnapshotsAction.java     |  0
 .../actions/ExpireSnapshotsActionResult.java       |  0
 .../apache/iceberg/actions/ManifestFileBean.java   |  0
 .../iceberg/actions/RemoveOrphanFilesAction.java   |  0
 .../iceberg/actions/RewriteDataFilesAction.java    |  0
 .../iceberg/actions/RewriteManifestsAction.java    |  0
 .../actions/RewriteManifestsActionResult.java      |  0
 .../org/apache/iceberg/actions/SnapshotAction.java |  0
 .../org/apache/iceberg/spark/IcebergSpark.java     |  0
 .../org/apache/iceberg/spark/JobGroupInfo.java     |  0
 .../org/apache/iceberg/spark/JobGroupUtils.java    |  0
 .../iceberg/spark/PruneColumnsWithReordering.java  |  0
 .../spark/PruneColumnsWithoutReordering.java       |  0
 .../org/apache/iceberg/spark/SparkConfParser.java  |  0
 .../org/apache/iceberg/spark/SparkDataFile.java    |  0
 .../apache/iceberg/spark/SparkExceptionUtil.java   |  0
 .../iceberg/spark/SparkFixupTimestampType.java     |  0
 .../org/apache/iceberg/spark/SparkFixupTypes.java  |  0
 .../org/apache/iceberg/spark/SparkReadConf.java    |  0
 .../org/apache/iceberg/spark/SparkReadOptions.java |  0
 .../apache/iceberg/spark/SparkSQLProperties.java   |  0
 .../org/apache/iceberg/spark/SparkSchemaUtil.java  |  0
 .../org/apache/iceberg/spark/SparkStructLike.java  |  0
 .../org/apache/iceberg/spark/SparkTableUtil.java   |  4 +-
 .../org/apache/iceberg/spark/SparkTypeToType.java  |  0
 .../org/apache/iceberg/spark/SparkTypeVisitor.java |  0
 .../java/org/apache/iceberg/spark/SparkUtil.java   |  0
 .../apache/iceberg/spark/SparkValueConverter.java  |  0
 .../org/apache/iceberg/spark/SparkWriteConf.java   |  0
 .../apache/iceberg/spark/SparkWriteOptions.java    |  0
 .../org/apache/iceberg/spark/TypeToSparkType.java  |  0
 .../actions/BaseDeleteOrphanFilesSparkAction.java  |  0
 .../BaseDeleteReachableFilesSparkAction.java       |  0
 .../actions/BaseExpireSnapshotsSparkAction.java    |  0
 .../actions/BaseRewriteDataFilesSparkAction.java   |  0
 .../actions/BaseRewriteManifestsSparkAction.java   |  0
 .../actions/BaseSnapshotUpdateSparkAction.java     |  0
 .../iceberg/spark/actions/BaseSparkAction.java     |  0
 .../iceberg/spark/actions/BaseSparkActions.java    |  0
 .../spark/data/AvroWithSparkSchemaVisitor.java     |  0
 .../spark/data/ParquetWithSparkSchemaVisitor.java  |  0
 .../apache/iceberg/spark/data/SparkAvroReader.java |  0
 .../apache/iceberg/spark/data/SparkAvroWriter.java |  0
 .../apache/iceberg/spark/data/SparkOrcReader.java  |  0
 .../iceberg/spark/data/SparkOrcValueReaders.java   |  0
 .../iceberg/spark/data/SparkOrcValueWriters.java   |  0
 .../apache/iceberg/spark/data/SparkOrcWriter.java  |  0
 .../iceberg/spark/data/SparkParquetReaders.java    |  0
 .../iceberg/spark/data/SparkParquetWriters.java    |  0
 .../iceberg/spark/data/SparkValueReaders.java      |  0
 .../iceberg/spark/data/SparkValueWriters.java      |  0
 .../vectorized/ArrowVectorAccessorFactory.java     |  0
 .../data/vectorized/ArrowVectorAccessors.java      |  0
 .../spark/data/vectorized/ColumnarBatchReader.java |  0
 .../data/vectorized/ConstantColumnVector.java      |  2 +-
 .../data/vectorized/IcebergArrowColumnVector.java  |  0
 .../data/vectorized/RowPositionColumnVector.java   |  2 +-
 .../data/vectorized/VectorizedSparkOrcReaders.java |  0
 .../vectorized/VectorizedSparkParquetReaders.java  |  0
 .../iceberg/spark/source/BaseDataReader.java       |  0
 .../iceberg/spark/source/BatchDataReader.java      |  0
 .../spark/source/EqualityDeleteRowReader.java      |  0
 .../iceberg/spark/source/InternalRowWrapper.java   |  0
 .../apache/iceberg/spark/source/RowDataReader.java |  0
 .../iceberg/spark/source/RowDataRewriter.java      |  0
 .../iceberg/spark/source/SparkAppenderFactory.java |  0
 .../spark/source/SparkFileWriterFactory.java       |  0
 .../spark/source/SparkPartitionedFanoutWriter.java |  0
 .../spark/source/SparkPartitionedWriter.java       |  0
 .../iceberg/spark/source/StructInternalRow.java    |  0
 .../test/java/org/apache/iceberg/KryoHelpers.java  |  0
 .../java/org/apache/iceberg/TaskCheckHelper.java   |  0
 .../apache/iceberg/TestDataFileSerialization.java  |  0
 .../apache/iceberg/TestFileIOSerialization.java    |  0
 .../iceberg/TestManifestFileSerialization.java     |  0
 .../apache/iceberg/TestScanTaskSerialization.java  |  0
 .../org/apache/iceberg/TestTableSerialization.java |  0
 .../actions/TestDeleteReachableFilesAction.java    |  0
 .../iceberg/actions/TestExpireSnapshotsAction.java |  0
 .../actions/TestRemoveOrphanFilesAction.java       |  0
 .../actions/TestRewriteDataFilesAction.java        |  0
 .../actions/TestRewriteManifestsAction.java        |  0
 .../org/apache/iceberg/spark/SparkTestBase.java    |  0
 .../apache/iceberg/spark/TestSparkSchemaUtil.java  |  0
 .../actions/TestNewRewriteDataFilesAction.java     |  0
 .../apache/iceberg/spark/data/AvroDataTest.java    |  0
 .../apache/iceberg/spark/data/GenericsHelpers.java |  0
 .../org/apache/iceberg/spark/data/RandomData.java  |  0
 .../org/apache/iceberg/spark/data/TestHelpers.java |  0
 .../apache/iceberg/spark/data/TestOrcWrite.java    |  0
 .../iceberg/spark/data/TestParquetAvroReader.java  |  0
 .../iceberg/spark/data/TestParquetAvroWriter.java  |  0
 .../iceberg/spark/data/TestSparkAvroEnums.java     |  0
 .../iceberg/spark/data/TestSparkAvroReader.java    |  0
 .../iceberg/spark/data/TestSparkDateTimes.java     |  6 +-
 .../data/TestSparkOrcReadMetadataColumns.java      |  0
 .../iceberg/spark/data/TestSparkOrcReader.java     |  0
 .../data/TestSparkParquetReadMetadataColumns.java  |  0
 .../iceberg/spark/data/TestSparkParquetReader.java |  0
 .../iceberg/spark/data/TestSparkParquetWriter.java |  0
 .../spark/data/TestSparkRecordOrcReaderWriter.java |  0
 ...estParquetDictionaryEncodedVectorizedReads.java |  0
 ...naryFallbackToPlainEncodingVectorizedReads.java |  0
 .../vectorized/TestParquetVectorizedReads.java     |  0
 .../apache/iceberg/spark/source/LogMessage.java    |  0
 .../apache/iceberg/spark/source/SimpleRecord.java  |  0
 .../apache/iceberg/spark/source/TestAvroScan.java  |  0
 .../iceberg/spark/source/TestDataFrameWrites.java  |  0
 .../spark/source/TestDataSourceOptions.java        |  0
 .../spark/source/TestForwardCompatibility.java     |  3 +-
 .../source/TestIcebergSourceHadoopTables.java      |  0
 .../spark/source/TestIcebergSourceHiveTables.java  |  0
 .../spark/source/TestIcebergSourceTablesBase.java  |  0
 .../iceberg/spark/source/TestIcebergSpark.java     |  0
 .../spark/source/TestIdentityPartitionData.java    |  0
 .../spark/source/TestInternalRowWrapper.java       |  0
 .../iceberg/spark/source/TestParquetScan.java      |  0
 .../iceberg/spark/source/TestPartitionPruning.java |  0
 .../iceberg/spark/source/TestPartitionValues.java  |  0
 .../iceberg/spark/source/TestReadProjection.java   |  0
 .../spark/source/TestSnapshotSelection.java        |  0
 .../spark/source/TestSparkAppenderFactory.java     |  0
 .../spark/source/TestSparkBaseDataReader.java      |  0
 .../iceberg/spark/source/TestSparkDataFile.java    |  0
 .../iceberg/spark/source/TestSparkDataWrite.java   |  0
 .../spark/source/TestSparkFileWriterFactory.java   |  0
 .../spark/source/TestSparkMergingMetrics.java      |  0
 .../spark/source/TestSparkPartitioningWriters.java |  0
 .../source/TestSparkPositionDeltaWriters.java      |  0
 .../spark/source/TestSparkReadProjection.java      |  0
 .../spark/source/TestSparkReaderDeletes.java       |  0
 .../spark/source/TestSparkRollingFileWriters.java  |  0
 .../iceberg/spark/source/TestSparkSchema.java      |  0
 .../spark/source/TestSparkWriterMetrics.java       |  0
 .../spark/source/TestStructuredStreaming.java      |  0
 .../apache/iceberg/spark/source/TestTables.java    |  0
 .../spark/source/TestTimestampWithoutZone.java     |  0
 .../spark/source/TestWriteMetricsConfig.java       |  0
 .../iceberg/spark/source/ThreeColumnRecord.java    |  0
 342 files changed, 37 insertions(+), 84 deletions(-)

diff --git a/jmh.gradle b/jmh.gradle
index 5e4cc1b..24a7878 100644
--- a/jmh.gradle
+++ b/jmh.gradle
@@ -45,14 +45,6 @@ configure(jmhProjects) {
     zip64 true
   }
 
-  // Path is relative to either spark2 or spark3 folder, depending on project being tested
-  sourceSets {
-    jmh {
-      java.srcDirs = ['src/jmh/java', '../../../spark/src/jmh/java']
-      compileClasspath += sourceSets.main.runtimeClasspath
-    }
-  }
-
   jmhCompileGeneratedClasses {
     pluginManager.withPlugin('com.palantir.baseline-error-prone') {
       options.errorprone.enabled = false
diff --git a/spark/build.gradle b/spark/build.gradle
index b343268..30ea7fe 100644
--- a/spark/build.gradle
+++ b/spark/build.gradle
@@ -17,71 +17,6 @@
  * under the License.
  */
 
-project(':iceberg-spark') {
-  configurations.all {
-    resolutionStrategy {
-      // Spark 2.4.4 can only use the below datanucleus version, the versions introduced
-      // by Hive 2.3.6 will meet lots of unexpected issues, so here force to use the versions
-      // introduced by Hive 1.2.1.
-      force 'org.datanucleus:datanucleus-api-jdo:3.2.6'
-      force 'org.datanucleus:datanucleus-core:3.2.10'
-      force 'org.datanucleus:datanucleus-rdbms:3.2.9'
-    }
-  }
-
-  dependencies {
-    implementation project(path: ':iceberg-bundled-guava', configuration: 'shadow')
-    api project(':iceberg-api')
-    implementation project(':iceberg-common')
-    implementation project(':iceberg-core')
-    api project(':iceberg-data')
-    implementation project(':iceberg-orc')
-    implementation project(':iceberg-parquet')
-    implementation project(':iceberg-arrow')
-    implementation project(':iceberg-hive-metastore')
-
-    compileOnly "com.google.errorprone:error_prone_annotations"
-    compileOnly "org.apache.avro:avro"
-    compileOnly("org.apache.spark:spark-hive_2.11") {
-      exclude group: 'org.apache.avro', module: 'avro'
-    }
-
-    implementation("org.apache.orc:orc-core::nohive") {
-      exclude group: 'org.apache.hadoop'
-      exclude group: 'commons-lang'
-      // These artifacts are shaded and included in the orc-core fat jar
-      exclude group: 'com.google.protobuf', module: 'protobuf-java'
-      exclude group: 'org.apache.hive', module: 'hive-storage-api'
-    }
-
-    implementation("org.apache.arrow:arrow-vector") {
-      exclude group: 'io.netty', module: 'netty-buffer'
-      exclude group: 'io.netty', module: 'netty-common'
-      exclude group: 'com.google.code.findbugs', module: 'jsr305'
-    }
-
-    testImplementation("org.apache.hadoop:hadoop-minicluster") {
-      exclude group: 'org.apache.avro', module: 'avro'
-    }
-    testImplementation project(path: ':iceberg-hive-metastore', configuration: 'testArtifacts')
-    testImplementation project(path: ':iceberg-api', configuration: 'testArtifacts')
-    testImplementation project(path: ':iceberg-core', configuration: 'testArtifacts')
-    testImplementation project(path: ':iceberg-data', configuration: 'testArtifacts')
-  }
-
-  test {
-    // For vectorized reads
-    // Allow unsafe memory access to avoid the costly check arrow does to check if index is within bounds
-    systemProperty("arrow.enable_unsafe_memory_access", "true")
-    // Disable expensive null check for every get(index) call.
-    // Iceberg manages nullability checks itself instead of relying on arrow.
-    systemProperty("arrow.enable_null_check_for_get", "false")
-
-    // Vectorized reads need more memory
-    maxHeapSize '2500m'
-  }
-}
-
 // add enabled Spark version modules to the build
 def sparkVersions = (System.getProperty("sparkVersions") != null ? System.getProperty("sparkVersions") : System.getProperty("defaultSparkVersions")).split(",")
 
@@ -92,4 +27,3 @@ if (jdkVersion == '8' && sparkVersions.contains("2.4")) {
 if (sparkVersions.contains("3.0")) {
   apply from: file("$projectDir/v3.0/build.gradle")
 }
-
diff --git a/spark/v2.4/build.gradle b/spark/v2.4/build.gradle
index b9d3c1a..4fbbf73 100644
--- a/spark/v2.4/build.gradle
+++ b/spark/v2.4/build.gradle
@@ -43,21 +43,34 @@ project(':iceberg-spark:iceberg-spark2') {
     implementation project(':iceberg-parquet')
     implementation project(':iceberg-arrow')
     implementation project(':iceberg-hive-metastore')
-    implementation project(':iceberg-spark')
     implementation "com.github.ben-manes.caffeine:caffeine"
 
+    compileOnly "com.google.errorprone:error_prone_annotations"
     compileOnly "org.apache.avro:avro"
     compileOnly("org.apache.spark:spark-hive_2.11") {
       exclude group: 'org.apache.avro', module: 'avro'
     }
 
-    testImplementation project(path: ':iceberg-spark', configuration: 'testArtifacts')
+    implementation("org.apache.orc:orc-core::nohive") {
+      exclude group: 'org.apache.hadoop'
+      exclude group: 'commons-lang'
+      // These artifacts are shaded and included in the orc-core fat jar
+      exclude group: 'com.google.protobuf', module: 'protobuf-java'
+      exclude group: 'org.apache.hive', module: 'hive-storage-api'
+    }
+
+    implementation("org.apache.arrow:arrow-vector") {
+      exclude group: 'io.netty', module: 'netty-buffer'
+      exclude group: 'io.netty', module: 'netty-common'
+      exclude group: 'com.google.code.findbugs', module: 'jsr305'
+    }
 
     testImplementation("org.apache.hadoop:hadoop-minicluster") {
       exclude group: 'org.apache.avro', module: 'avro'
     }
     testImplementation project(path: ':iceberg-hive-metastore', configuration: 'testArtifacts')
     testImplementation project(path: ':iceberg-api', configuration: 'testArtifacts')
+    testImplementation project(path: ':iceberg-core', configuration: 'testArtifacts')
     testImplementation project(path: ':iceberg-data', configuration: 'testArtifacts')
   }
 
diff --git a/spark/src/jmh/java/org/apache/iceberg/spark/SparkBenchmarkUtil.java b/spark/v2.4/spark2/src/jmh/java/org/apache/iceberg/spark/SparkBenchmarkUtil.java
similarity index 100%
copy from spark/src/jmh/java/org/apache/iceberg/spark/SparkBenchmarkUtil.java
copy to spark/v2.4/spark2/src/jmh/java/org/apache/iceberg/spark/SparkBenchmarkUtil.java
diff --git a/spark/src/jmh/java/org/apache/iceberg/spark/data/parquet/SparkParquetReadersFlatDataBenchmark.java b/spark/v2.4/spark2/src/jmh/java/org/apache/iceberg/spark/data/parquet/SparkParquetReadersFlatDataBenchmark.java
similarity index 100%
copy from spark/src/jmh/java/org/apache/iceberg/spark/data/parquet/SparkParquetReadersFlatDataBenchmark.java
copy to spark/v2.4/spark2/src/jmh/java/org/apache/iceberg/spark/data/parquet/SparkParquetReadersFlatDataBenchmark.java
diff --git a/spark/src/jmh/java/org/apache/iceberg/spark/data/parquet/SparkParquetReadersNestedDataBenchmark.java b/spark/v2.4/spark2/src/jmh/java/org/apache/iceberg/spark/data/parquet/SparkParquetReadersNestedDataBenchmark.java
similarity index 100%
copy from spark/src/jmh/java/org/apache/iceberg/spark/data/parquet/SparkParquetReadersNestedDataBenchmark.java
copy to spark/v2.4/spark2/src/jmh/java/org/apache/iceberg/spark/data/parquet/SparkParquetReadersNestedDataBenchmark.java
diff --git a/spark/src/jmh/java/org/apache/iceberg/spark/data/parquet/SparkParquetWritersFlatDataBenchmark.java b/spark/v2.4/spark2/src/jmh/java/org/apache/iceberg/spark/data/parquet/SparkParquetWritersFlatDataBenchmark.java
similarity index 100%
copy from spark/src/jmh/java/org/apache/iceberg/spark/data/parquet/SparkParquetWritersFlatDataBenchmark.java
copy to spark/v2.4/spark2/src/jmh/java/org/apache/iceberg/spark/data/parquet/SparkParquetWritersFlatDataBenchmark.java
diff --git a/spark/src/jmh/java/org/apache/iceberg/spark/data/parquet/SparkParquetWritersNestedDataBenchmark.java b/spark/v2.4/spark2/src/jmh/java/org/apache/iceberg/spark/data/parquet/SparkParquetWritersNestedDataBenchmark.java
similarity index 100%
copy from spark/src/jmh/java/org/apache/iceberg/spark/data/parquet/SparkParquetWritersNestedDataBenchmark.java
copy to spark/v2.4/spark2/src/jmh/java/org/apache/iceberg/spark/data/parquet/SparkParquetWritersNestedDataBenchmark.java
diff --git a/spark/src/jmh/java/org/apache/iceberg/spark/source/Action.java b/spark/v2.4/spark2/src/jmh/java/org/apache/iceberg/spark/source/Action.java
similarity index 100%
copy from spark/src/jmh/java/org/apache/iceberg/spark/source/Action.java
copy to spark/v2.4/spark2/src/jmh/java/org/apache/iceberg/spark/source/Action.java
diff --git a/spark/src/jmh/java/org/apache/iceberg/spark/source/IcebergSourceBenchmark.java b/spark/v2.4/spark2/src/jmh/java/org/apache/iceberg/spark/source/IcebergSourceBenchmark.java
similarity index 100%
copy from spark/src/jmh/java/org/apache/iceberg/spark/source/IcebergSourceBenchmark.java
copy to spark/v2.4/spark2/src/jmh/java/org/apache/iceberg/spark/source/IcebergSourceBenchmark.java
diff --git a/spark/src/jmh/java/org/apache/iceberg/spark/source/IcebergSourceFlatDataBenchmark.java b/spark/v2.4/spark2/src/jmh/java/org/apache/iceberg/spark/source/IcebergSourceFlatDataBenchmark.java
similarity index 100%
copy from spark/src/jmh/java/org/apache/iceberg/spark/source/IcebergSourceFlatDataBenchmark.java
copy to spark/v2.4/spark2/src/jmh/java/org/apache/iceberg/spark/source/IcebergSourceFlatDataBenchmark.java
diff --git a/spark/src/jmh/java/org/apache/iceberg/spark/source/IcebergSourceNestedDataBenchmark.java b/spark/v2.4/spark2/src/jmh/java/org/apache/iceberg/spark/source/IcebergSourceNestedDataBenchmark.java
similarity index 100%
copy from spark/src/jmh/java/org/apache/iceberg/spark/source/IcebergSourceNestedDataBenchmark.java
copy to spark/v2.4/spark2/src/jmh/java/org/apache/iceberg/spark/source/IcebergSourceNestedDataBenchmark.java
diff --git a/spark/src/jmh/java/org/apache/iceberg/spark/source/IcebergSourceNestedListDataBenchmark.java b/spark/v2.4/spark2/src/jmh/java/org/apache/iceberg/spark/source/IcebergSourceNestedListDataBenchmark.java
similarity index 100%
copy from spark/src/jmh/java/org/apache/iceberg/spark/source/IcebergSourceNestedListDataBenchmark.java
copy to spark/v2.4/spark2/src/jmh/java/org/apache/iceberg/spark/source/IcebergSourceNestedListDataBenchmark.java
diff --git a/spark/src/jmh/java/org/apache/iceberg/spark/source/WritersBenchmark.java b/spark/v2.4/spark2/src/jmh/java/org/apache/iceberg/spark/source/WritersBenchmark.java
similarity index 100%
copy from spark/src/jmh/java/org/apache/iceberg/spark/source/WritersBenchmark.java
copy to spark/v2.4/spark2/src/jmh/java/org/apache/iceberg/spark/source/WritersBenchmark.java
diff --git a/spark/src/jmh/java/org/apache/iceberg/spark/source/avro/AvroWritersBenchmark.java b/spark/v2.4/spark2/src/jmh/java/org/apache/iceberg/spark/source/avro/AvroWritersBenchmark.java
similarity index 100%
copy from spark/src/jmh/java/org/apache/iceberg/spark/source/avro/AvroWritersBenchmark.java
copy to spark/v2.4/spark2/src/jmh/java/org/apache/iceberg/spark/source/avro/AvroWritersBenchmark.java
diff --git a/spark/src/jmh/java/org/apache/iceberg/spark/source/avro/IcebergSourceFlatAvroDataReadBenchmark.java b/spark/v2.4/spark2/src/jmh/java/org/apache/iceberg/spark/source/avro/IcebergSourceFlatAvroDataReadBenchmark.java
similarity index 100%
copy from spark/src/jmh/java/org/apache/iceberg/spark/source/avro/IcebergSourceFlatAvroDataReadBenchmark.java
copy to spark/v2.4/spark2/src/jmh/java/org/apache/iceberg/spark/source/avro/IcebergSourceFlatAvroDataReadBenchmark.java
diff --git a/spark/src/jmh/java/org/apache/iceberg/spark/source/avro/IcebergSourceNestedAvroDataReadBenchmark.java b/spark/v2.4/spark2/src/jmh/java/org/apache/iceberg/spark/source/avro/IcebergSourceNestedAvroDataReadBenchmark.java
similarity index 100%
copy from spark/src/jmh/java/org/apache/iceberg/spark/source/avro/IcebergSourceNestedAvroDataReadBenchmark.java
copy to spark/v2.4/spark2/src/jmh/java/org/apache/iceberg/spark/source/avro/IcebergSourceNestedAvroDataReadBenchmark.java
diff --git a/spark/src/jmh/java/org/apache/iceberg/spark/source/orc/IcebergSourceFlatORCDataBenchmark.java b/spark/v2.4/spark2/src/jmh/java/org/apache/iceberg/spark/source/orc/IcebergSourceFlatORCDataBenchmark.java
similarity index 100%
copy from spark/src/jmh/java/org/apache/iceberg/spark/source/orc/IcebergSourceFlatORCDataBenchmark.java
copy to spark/v2.4/spark2/src/jmh/java/org/apache/iceberg/spark/source/orc/IcebergSourceFlatORCDataBenchmark.java
diff --git a/spark/src/jmh/java/org/apache/iceberg/spark/source/orc/IcebergSourceFlatORCDataReadBenchmark.java b/spark/v2.4/spark2/src/jmh/java/org/apache/iceberg/spark/source/orc/IcebergSourceFlatORCDataReadBenchmark.java
similarity index 100%
copy from spark/src/jmh/java/org/apache/iceberg/spark/source/orc/IcebergSourceFlatORCDataReadBenchmark.java
copy to spark/v2.4/spark2/src/jmh/java/org/apache/iceberg/spark/source/orc/IcebergSourceFlatORCDataReadBenchmark.java
diff --git a/spark/src/jmh/java/org/apache/iceberg/spark/source/orc/IcebergSourceNestedListORCDataWriteBenchmark.java b/spark/v2.4/spark2/src/jmh/java/org/apache/iceberg/spark/source/orc/IcebergSourceNestedListORCDataWriteBenchmark.java
similarity index 100%
copy from spark/src/jmh/java/org/apache/iceberg/spark/source/orc/IcebergSourceNestedListORCDataWriteBenchmark.java
copy to spark/v2.4/spark2/src/jmh/java/org/apache/iceberg/spark/source/orc/IcebergSourceNestedListORCDataWriteBenchmark.java
diff --git a/spark/src/jmh/java/org/apache/iceberg/spark/source/orc/IcebergSourceNestedORCDataReadBenchmark.java b/spark/v2.4/spark2/src/jmh/java/org/apache/iceberg/spark/source/orc/IcebergSourceNestedORCDataReadBenchmark.java
similarity index 100%
copy from spark/src/jmh/java/org/apache/iceberg/spark/source/orc/IcebergSourceNestedORCDataReadBenchmark.java
copy to spark/v2.4/spark2/src/jmh/java/org/apache/iceberg/spark/source/orc/IcebergSourceNestedORCDataReadBenchmark.java
diff --git a/spark/src/jmh/java/org/apache/iceberg/spark/source/parquet/IcebergSourceFlatParquetDataFilterBenchmark.java b/spark/v2.4/spark2/src/jmh/java/org/apache/iceberg/spark/source/parquet/IcebergSourceFlatParquetDataFilterBenchmark.java
similarity index 100%
copy from spark/src/jmh/java/org/apache/iceberg/spark/source/parquet/IcebergSourceFlatParquetDataFilterBenchmark.java
copy to spark/v2.4/spark2/src/jmh/java/org/apache/iceberg/spark/source/parquet/IcebergSourceFlatParquetDataFilterBenchmark.java
diff --git a/spark/src/jmh/java/org/apache/iceberg/spark/source/parquet/IcebergSourceFlatParquetDataReadBenchmark.java b/spark/v2.4/spark2/src/jmh/java/org/apache/iceberg/spark/source/parquet/IcebergSourceFlatParquetDataReadBenchmark.java
similarity index 100%
copy from spark/src/jmh/java/org/apache/iceberg/spark/source/parquet/IcebergSourceFlatParquetDataReadBenchmark.java
copy to spark/v2.4/spark2/src/jmh/java/org/apache/iceberg/spark/source/parquet/IcebergSourceFlatParquetDataReadBenchmark.java
diff --git a/spark/src/jmh/java/org/apache/iceberg/spark/source/parquet/IcebergSourceFlatParquetDataWriteBenchmark.java b/spark/v2.4/spark2/src/jmh/java/org/apache/iceberg/spark/source/parquet/IcebergSourceFlatParquetDataWriteBenchmark.java
similarity index 100%
copy from spark/src/jmh/java/org/apache/iceberg/spark/source/parquet/IcebergSourceFlatParquetDataWriteBenchmark.java
copy to spark/v2.4/spark2/src/jmh/java/org/apache/iceberg/spark/source/parquet/IcebergSourceFlatParquetDataWriteBenchmark.java
diff --git a/spark/src/jmh/java/org/apache/iceberg/spark/source/parquet/IcebergSourceNestedListParquetDataWriteBenchmark.java b/spark/v2.4/spark2/src/jmh/java/org/apache/iceberg/spark/source/parquet/IcebergSourceNestedListParquetDataWriteBenchmark.java
similarity index 100%
copy from spark/src/jmh/java/org/apache/iceberg/spark/source/parquet/IcebergSourceNestedListParquetDataWriteBenchmark.java
copy to spark/v2.4/spark2/src/jmh/java/org/apache/iceberg/spark/source/parquet/IcebergSourceNestedListParquetDataWriteBenchmark.java
diff --git a/spark/src/jmh/java/org/apache/iceberg/spark/source/parquet/IcebergSourceNestedParquetDataFilterBenchmark.java b/spark/v2.4/spark2/src/jmh/java/org/apache/iceberg/spark/source/parquet/IcebergSourceNestedParquetDataFilterBenchmark.java
similarity index 100%
copy from spark/src/jmh/java/org/apache/iceberg/spark/source/parquet/IcebergSourceNestedParquetDataFilterBenchmark.java
copy to spark/v2.4/spark2/src/jmh/java/org/apache/iceberg/spark/source/parquet/IcebergSourceNestedParquetDataFilterBenchmark.java
diff --git a/spark/src/jmh/java/org/apache/iceberg/spark/source/parquet/IcebergSourceNestedParquetDataReadBenchmark.java b/spark/v2.4/spark2/src/jmh/java/org/apache/iceberg/spark/source/parquet/IcebergSourceNestedParquetDataReadBenchmark.java
similarity index 100%
copy from spark/src/jmh/java/org/apache/iceberg/spark/source/parquet/IcebergSourceNestedParquetDataReadBenchmark.java
copy to spark/v2.4/spark2/src/jmh/java/org/apache/iceberg/spark/source/parquet/IcebergSourceNestedParquetDataReadBenchmark.java
diff --git a/spark/src/jmh/java/org/apache/iceberg/spark/source/parquet/IcebergSourceNestedParquetDataWriteBenchmark.java b/spark/v2.4/spark2/src/jmh/java/org/apache/iceberg/spark/source/parquet/IcebergSourceNestedParquetDataWriteBenchmark.java
similarity index 100%
copy from spark/src/jmh/java/org/apache/iceberg/spark/source/parquet/IcebergSourceNestedParquetDataWriteBenchmark.java
copy to spark/v2.4/spark2/src/jmh/java/org/apache/iceberg/spark/source/parquet/IcebergSourceNestedParquetDataWriteBenchmark.java
diff --git a/spark/src/jmh/java/org/apache/iceberg/spark/source/parquet/ParquetWritersBenchmark.java b/spark/v2.4/spark2/src/jmh/java/org/apache/iceberg/spark/source/parquet/ParquetWritersBenchmark.java
similarity index 100%
copy from spark/src/jmh/java/org/apache/iceberg/spark/source/parquet/ParquetWritersBenchmark.java
copy to spark/v2.4/spark2/src/jmh/java/org/apache/iceberg/spark/source/parquet/ParquetWritersBenchmark.java
diff --git a/spark/src/jmh/java/org/apache/iceberg/spark/source/parquet/vectorized/VectorizedReadDictionaryEncodedFlatParquetDataBenchmark.java b/spark/v2.4/spark2/src/jmh/java/org/apache/iceberg/spark/source/parquet/vectorized/VectorizedReadDictionaryEncodedFlatParquetDataBenchmark.java
similarity index 100%
copy from spark/src/jmh/java/org/apache/iceberg/spark/source/parquet/vectorized/VectorizedReadDictionaryEncodedFlatParquetDataBenchmark.java
copy to spark/v2.4/spark2/src/jmh/java/org/apache/iceberg/spark/source/parquet/vectorized/VectorizedReadDictionaryEncodedFlatParquetDataBenchmark.java
diff --git a/spark/src/jmh/java/org/apache/iceberg/spark/source/parquet/vectorized/VectorizedReadFlatParquetDataBenchmark.java b/spark/v2.4/spark2/src/jmh/java/org/apache/iceberg/spark/source/parquet/vectorized/VectorizedReadFlatParquetDataBenchmark.java
similarity index 100%
copy from spark/src/jmh/java/org/apache/iceberg/spark/source/parquet/vectorized/VectorizedReadFlatParquetDataBenchmark.java
copy to spark/v2.4/spark2/src/jmh/java/org/apache/iceberg/spark/source/parquet/vectorized/VectorizedReadFlatParquetDataBenchmark.java
diff --git a/spark/src/main/java/org/apache/iceberg/actions/Actions.java b/spark/v2.4/spark2/src/main/java/org/apache/iceberg/actions/Actions.java
similarity index 100%
copy from spark/src/main/java/org/apache/iceberg/actions/Actions.java
copy to spark/v2.4/spark2/src/main/java/org/apache/iceberg/actions/Actions.java
diff --git a/spark/src/main/java/org/apache/iceberg/actions/CreateAction.java b/spark/v2.4/spark2/src/main/java/org/apache/iceberg/actions/CreateAction.java
similarity index 100%
copy from spark/src/main/java/org/apache/iceberg/actions/CreateAction.java
copy to spark/v2.4/spark2/src/main/java/org/apache/iceberg/actions/CreateAction.java
diff --git a/spark/src/main/java/org/apache/iceberg/actions/ExpireSnapshotsAction.java b/spark/v2.4/spark2/src/main/java/org/apache/iceberg/actions/ExpireSnapshotsAction.java
similarity index 100%
copy from spark/src/main/java/org/apache/iceberg/actions/ExpireSnapshotsAction.java
copy to spark/v2.4/spark2/src/main/java/org/apache/iceberg/actions/ExpireSnapshotsAction.java
diff --git a/spark/src/main/java/org/apache/iceberg/actions/ExpireSnapshotsActionResult.java b/spark/v2.4/spark2/src/main/java/org/apache/iceberg/actions/ExpireSnapshotsActionResult.java
similarity index 100%
copy from spark/src/main/java/org/apache/iceberg/actions/ExpireSnapshotsActionResult.java
copy to spark/v2.4/spark2/src/main/java/org/apache/iceberg/actions/ExpireSnapshotsActionResult.java
diff --git a/spark/src/main/java/org/apache/iceberg/actions/ManifestFileBean.java b/spark/v2.4/spark2/src/main/java/org/apache/iceberg/actions/ManifestFileBean.java
similarity index 100%
copy from spark/src/main/java/org/apache/iceberg/actions/ManifestFileBean.java
copy to spark/v2.4/spark2/src/main/java/org/apache/iceberg/actions/ManifestFileBean.java
diff --git a/spark/src/main/java/org/apache/iceberg/actions/RemoveOrphanFilesAction.java b/spark/v2.4/spark2/src/main/java/org/apache/iceberg/actions/RemoveOrphanFilesAction.java
similarity index 100%
copy from spark/src/main/java/org/apache/iceberg/actions/RemoveOrphanFilesAction.java
copy to spark/v2.4/spark2/src/main/java/org/apache/iceberg/actions/RemoveOrphanFilesAction.java
diff --git a/spark/src/main/java/org/apache/iceberg/actions/RewriteDataFilesAction.java b/spark/v2.4/spark2/src/main/java/org/apache/iceberg/actions/RewriteDataFilesAction.java
similarity index 100%
copy from spark/src/main/java/org/apache/iceberg/actions/RewriteDataFilesAction.java
copy to spark/v2.4/spark2/src/main/java/org/apache/iceberg/actions/RewriteDataFilesAction.java
diff --git a/spark/src/main/java/org/apache/iceberg/actions/RewriteManifestsAction.java b/spark/v2.4/spark2/src/main/java/org/apache/iceberg/actions/RewriteManifestsAction.java
similarity index 100%
copy from spark/src/main/java/org/apache/iceberg/actions/RewriteManifestsAction.java
copy to spark/v2.4/spark2/src/main/java/org/apache/iceberg/actions/RewriteManifestsAction.java
diff --git a/spark/src/main/java/org/apache/iceberg/actions/RewriteManifestsActionResult.java b/spark/v2.4/spark2/src/main/java/org/apache/iceberg/actions/RewriteManifestsActionResult.java
similarity index 100%
copy from spark/src/main/java/org/apache/iceberg/actions/RewriteManifestsActionResult.java
copy to spark/v2.4/spark2/src/main/java/org/apache/iceberg/actions/RewriteManifestsActionResult.java
diff --git a/spark/src/main/java/org/apache/iceberg/actions/SnapshotAction.java b/spark/v2.4/spark2/src/main/java/org/apache/iceberg/actions/SnapshotAction.java
similarity index 100%
copy from spark/src/main/java/org/apache/iceberg/actions/SnapshotAction.java
copy to spark/v2.4/spark2/src/main/java/org/apache/iceberg/actions/SnapshotAction.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/IcebergSpark.java b/spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/IcebergSpark.java
similarity index 100%
copy from spark/src/main/java/org/apache/iceberg/spark/IcebergSpark.java
copy to spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/IcebergSpark.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/JobGroupInfo.java b/spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/JobGroupInfo.java
similarity index 100%
copy from spark/src/main/java/org/apache/iceberg/spark/JobGroupInfo.java
copy to spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/JobGroupInfo.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/JobGroupUtils.java b/spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/JobGroupUtils.java
similarity index 100%
copy from spark/src/main/java/org/apache/iceberg/spark/JobGroupUtils.java
copy to spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/JobGroupUtils.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/PruneColumnsWithReordering.java b/spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/PruneColumnsWithReordering.java
similarity index 100%
copy from spark/src/main/java/org/apache/iceberg/spark/PruneColumnsWithReordering.java
copy to spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/PruneColumnsWithReordering.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/PruneColumnsWithoutReordering.java b/spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/PruneColumnsWithoutReordering.java
similarity index 100%
copy from spark/src/main/java/org/apache/iceberg/spark/PruneColumnsWithoutReordering.java
copy to spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/PruneColumnsWithoutReordering.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/SparkConfParser.java b/spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/SparkConfParser.java
similarity index 100%
copy from spark/src/main/java/org/apache/iceberg/spark/SparkConfParser.java
copy to spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/SparkConfParser.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/SparkDataFile.java b/spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/SparkDataFile.java
similarity index 100%
copy from spark/src/main/java/org/apache/iceberg/spark/SparkDataFile.java
copy to spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/SparkDataFile.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/SparkExceptionUtil.java b/spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/SparkExceptionUtil.java
similarity index 100%
copy from spark/src/main/java/org/apache/iceberg/spark/SparkExceptionUtil.java
copy to spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/SparkExceptionUtil.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/SparkFixupTimestampType.java b/spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/SparkFixupTimestampType.java
similarity index 100%
copy from spark/src/main/java/org/apache/iceberg/spark/SparkFixupTimestampType.java
copy to spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/SparkFixupTimestampType.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/SparkFixupTypes.java b/spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/SparkFixupTypes.java
similarity index 100%
copy from spark/src/main/java/org/apache/iceberg/spark/SparkFixupTypes.java
copy to spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/SparkFixupTypes.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/SparkReadConf.java b/spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/SparkReadConf.java
similarity index 100%
copy from spark/src/main/java/org/apache/iceberg/spark/SparkReadConf.java
copy to spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/SparkReadConf.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/SparkReadOptions.java b/spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/SparkReadOptions.java
similarity index 100%
copy from spark/src/main/java/org/apache/iceberg/spark/SparkReadOptions.java
copy to spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/SparkReadOptions.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/SparkSQLProperties.java b/spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/SparkSQLProperties.java
similarity index 100%
copy from spark/src/main/java/org/apache/iceberg/spark/SparkSQLProperties.java
copy to spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/SparkSQLProperties.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/SparkSchemaUtil.java b/spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/SparkSchemaUtil.java
similarity index 100%
copy from spark/src/main/java/org/apache/iceberg/spark/SparkSchemaUtil.java
copy to spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/SparkSchemaUtil.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/SparkStructLike.java b/spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/SparkStructLike.java
similarity index 100%
copy from spark/src/main/java/org/apache/iceberg/spark/SparkStructLike.java
copy to spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/SparkStructLike.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/SparkTableUtil.java b/spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/SparkTableUtil.java
similarity index 100%
copy from spark/src/main/java/org/apache/iceberg/spark/SparkTableUtil.java
copy to spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/SparkTableUtil.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/SparkTypeToType.java b/spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/SparkTypeToType.java
similarity index 100%
copy from spark/src/main/java/org/apache/iceberg/spark/SparkTypeToType.java
copy to spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/SparkTypeToType.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/SparkTypeVisitor.java b/spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/SparkTypeVisitor.java
similarity index 100%
copy from spark/src/main/java/org/apache/iceberg/spark/SparkTypeVisitor.java
copy to spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/SparkTypeVisitor.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/SparkUtil.java b/spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/SparkUtil.java
similarity index 100%
copy from spark/src/main/java/org/apache/iceberg/spark/SparkUtil.java
copy to spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/SparkUtil.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/SparkValueConverter.java b/spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/SparkValueConverter.java
similarity index 100%
copy from spark/src/main/java/org/apache/iceberg/spark/SparkValueConverter.java
copy to spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/SparkValueConverter.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/SparkWriteConf.java b/spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/SparkWriteConf.java
similarity index 100%
copy from spark/src/main/java/org/apache/iceberg/spark/SparkWriteConf.java
copy to spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/SparkWriteConf.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/SparkWriteOptions.java b/spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/SparkWriteOptions.java
similarity index 100%
copy from spark/src/main/java/org/apache/iceberg/spark/SparkWriteOptions.java
copy to spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/SparkWriteOptions.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/TypeToSparkType.java b/spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/TypeToSparkType.java
similarity index 100%
copy from spark/src/main/java/org/apache/iceberg/spark/TypeToSparkType.java
copy to spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/TypeToSparkType.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/actions/BaseDeleteOrphanFilesSparkAction.java b/spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/actions/BaseDeleteOrphanFilesSparkAction.java
similarity index 100%
copy from spark/src/main/java/org/apache/iceberg/spark/actions/BaseDeleteOrphanFilesSparkAction.java
copy to spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/actions/BaseDeleteOrphanFilesSparkAction.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/actions/BaseDeleteReachableFilesSparkAction.java b/spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/actions/BaseDeleteReachableFilesSparkAction.java
similarity index 100%
copy from spark/src/main/java/org/apache/iceberg/spark/actions/BaseDeleteReachableFilesSparkAction.java
copy to spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/actions/BaseDeleteReachableFilesSparkAction.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/actions/BaseExpireSnapshotsSparkAction.java b/spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/actions/BaseExpireSnapshotsSparkAction.java
similarity index 100%
copy from spark/src/main/java/org/apache/iceberg/spark/actions/BaseExpireSnapshotsSparkAction.java
copy to spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/actions/BaseExpireSnapshotsSparkAction.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/actions/BaseRewriteDataFilesSparkAction.java b/spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/actions/BaseRewriteDataFilesSparkAction.java
similarity index 100%
copy from spark/src/main/java/org/apache/iceberg/spark/actions/BaseRewriteDataFilesSparkAction.java
copy to spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/actions/BaseRewriteDataFilesSparkAction.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/actions/BaseRewriteManifestsSparkAction.java b/spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/actions/BaseRewriteManifestsSparkAction.java
similarity index 100%
copy from spark/src/main/java/org/apache/iceberg/spark/actions/BaseRewriteManifestsSparkAction.java
copy to spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/actions/BaseRewriteManifestsSparkAction.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/actions/BaseSnapshotUpdateSparkAction.java b/spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/actions/BaseSnapshotUpdateSparkAction.java
similarity index 100%
copy from spark/src/main/java/org/apache/iceberg/spark/actions/BaseSnapshotUpdateSparkAction.java
copy to spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/actions/BaseSnapshotUpdateSparkAction.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/actions/BaseSparkAction.java b/spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/actions/BaseSparkAction.java
similarity index 100%
copy from spark/src/main/java/org/apache/iceberg/spark/actions/BaseSparkAction.java
copy to spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/actions/BaseSparkAction.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/actions/BaseSparkActions.java b/spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/actions/BaseSparkActions.java
similarity index 100%
copy from spark/src/main/java/org/apache/iceberg/spark/actions/BaseSparkActions.java
copy to spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/actions/BaseSparkActions.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/data/AvroWithSparkSchemaVisitor.java b/spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/data/AvroWithSparkSchemaVisitor.java
similarity index 100%
copy from spark/src/main/java/org/apache/iceberg/spark/data/AvroWithSparkSchemaVisitor.java
copy to spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/data/AvroWithSparkSchemaVisitor.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/data/ParquetWithSparkSchemaVisitor.java b/spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/data/ParquetWithSparkSchemaVisitor.java
similarity index 100%
copy from spark/src/main/java/org/apache/iceberg/spark/data/ParquetWithSparkSchemaVisitor.java
copy to spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/data/ParquetWithSparkSchemaVisitor.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/data/SparkAvroReader.java b/spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/data/SparkAvroReader.java
similarity index 100%
copy from spark/src/main/java/org/apache/iceberg/spark/data/SparkAvroReader.java
copy to spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/data/SparkAvroReader.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/data/SparkAvroWriter.java b/spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/data/SparkAvroWriter.java
similarity index 100%
copy from spark/src/main/java/org/apache/iceberg/spark/data/SparkAvroWriter.java
copy to spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/data/SparkAvroWriter.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/data/SparkOrcReader.java b/spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/data/SparkOrcReader.java
similarity index 100%
copy from spark/src/main/java/org/apache/iceberg/spark/data/SparkOrcReader.java
copy to spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/data/SparkOrcReader.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/data/SparkOrcValueReaders.java b/spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/data/SparkOrcValueReaders.java
similarity index 100%
copy from spark/src/main/java/org/apache/iceberg/spark/data/SparkOrcValueReaders.java
copy to spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/data/SparkOrcValueReaders.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/data/SparkOrcValueWriters.java b/spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/data/SparkOrcValueWriters.java
similarity index 100%
copy from spark/src/main/java/org/apache/iceberg/spark/data/SparkOrcValueWriters.java
copy to spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/data/SparkOrcValueWriters.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/data/SparkOrcWriter.java b/spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/data/SparkOrcWriter.java
similarity index 100%
copy from spark/src/main/java/org/apache/iceberg/spark/data/SparkOrcWriter.java
copy to spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/data/SparkOrcWriter.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/data/SparkParquetReaders.java b/spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/data/SparkParquetReaders.java
similarity index 100%
copy from spark/src/main/java/org/apache/iceberg/spark/data/SparkParquetReaders.java
copy to spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/data/SparkParquetReaders.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/data/SparkParquetWriters.java b/spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/data/SparkParquetWriters.java
similarity index 100%
copy from spark/src/main/java/org/apache/iceberg/spark/data/SparkParquetWriters.java
copy to spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/data/SparkParquetWriters.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/data/SparkValueReaders.java b/spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/data/SparkValueReaders.java
similarity index 100%
copy from spark/src/main/java/org/apache/iceberg/spark/data/SparkValueReaders.java
copy to spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/data/SparkValueReaders.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/data/SparkValueWriters.java b/spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/data/SparkValueWriters.java
similarity index 100%
copy from spark/src/main/java/org/apache/iceberg/spark/data/SparkValueWriters.java
copy to spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/data/SparkValueWriters.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/data/vectorized/ArrowVectorAccessorFactory.java b/spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/data/vectorized/ArrowVectorAccessorFactory.java
similarity index 100%
copy from spark/src/main/java/org/apache/iceberg/spark/data/vectorized/ArrowVectorAccessorFactory.java
copy to spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/data/vectorized/ArrowVectorAccessorFactory.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/data/vectorized/ArrowVectorAccessors.java b/spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/data/vectorized/ArrowVectorAccessors.java
similarity index 100%
copy from spark/src/main/java/org/apache/iceberg/spark/data/vectorized/ArrowVectorAccessors.java
copy to spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/data/vectorized/ArrowVectorAccessors.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/data/vectorized/ColumnarBatchReader.java b/spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/data/vectorized/ColumnarBatchReader.java
similarity index 100%
copy from spark/src/main/java/org/apache/iceberg/spark/data/vectorized/ColumnarBatchReader.java
copy to spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/data/vectorized/ColumnarBatchReader.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/data/vectorized/ConstantColumnVector.java b/spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/data/vectorized/ConstantColumnVector.java
similarity index 100%
copy from spark/src/main/java/org/apache/iceberg/spark/data/vectorized/ConstantColumnVector.java
copy to spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/data/vectorized/ConstantColumnVector.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/data/vectorized/IcebergArrowColumnVector.java b/spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/data/vectorized/IcebergArrowColumnVector.java
similarity index 100%
copy from spark/src/main/java/org/apache/iceberg/spark/data/vectorized/IcebergArrowColumnVector.java
copy to spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/data/vectorized/IcebergArrowColumnVector.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/data/vectorized/RowPositionColumnVector.java b/spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/data/vectorized/RowPositionColumnVector.java
similarity index 100%
copy from spark/src/main/java/org/apache/iceberg/spark/data/vectorized/RowPositionColumnVector.java
copy to spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/data/vectorized/RowPositionColumnVector.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/data/vectorized/VectorizedSparkOrcReaders.java b/spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/data/vectorized/VectorizedSparkOrcReaders.java
similarity index 100%
copy from spark/src/main/java/org/apache/iceberg/spark/data/vectorized/VectorizedSparkOrcReaders.java
copy to spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/data/vectorized/VectorizedSparkOrcReaders.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/data/vectorized/VectorizedSparkParquetReaders.java b/spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/data/vectorized/VectorizedSparkParquetReaders.java
similarity index 100%
copy from spark/src/main/java/org/apache/iceberg/spark/data/vectorized/VectorizedSparkParquetReaders.java
copy to spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/data/vectorized/VectorizedSparkParquetReaders.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/source/BaseDataReader.java b/spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/source/BaseDataReader.java
similarity index 100%
copy from spark/src/main/java/org/apache/iceberg/spark/source/BaseDataReader.java
copy to spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/source/BaseDataReader.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/source/BatchDataReader.java b/spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/source/BatchDataReader.java
similarity index 100%
copy from spark/src/main/java/org/apache/iceberg/spark/source/BatchDataReader.java
copy to spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/source/BatchDataReader.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/source/EqualityDeleteRowReader.java b/spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/source/EqualityDeleteRowReader.java
similarity index 100%
copy from spark/src/main/java/org/apache/iceberg/spark/source/EqualityDeleteRowReader.java
copy to spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/source/EqualityDeleteRowReader.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/source/InternalRowWrapper.java b/spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/source/InternalRowWrapper.java
similarity index 100%
copy from spark/src/main/java/org/apache/iceberg/spark/source/InternalRowWrapper.java
copy to spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/source/InternalRowWrapper.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/source/RowDataReader.java b/spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/source/RowDataReader.java
similarity index 100%
copy from spark/src/main/java/org/apache/iceberg/spark/source/RowDataReader.java
copy to spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/source/RowDataReader.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/source/RowDataRewriter.java b/spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/source/RowDataRewriter.java
similarity index 100%
copy from spark/src/main/java/org/apache/iceberg/spark/source/RowDataRewriter.java
copy to spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/source/RowDataRewriter.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/source/SparkAppenderFactory.java b/spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/source/SparkAppenderFactory.java
similarity index 100%
copy from spark/src/main/java/org/apache/iceberg/spark/source/SparkAppenderFactory.java
copy to spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/source/SparkAppenderFactory.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/source/SparkFileWriterFactory.java b/spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/source/SparkFileWriterFactory.java
similarity index 100%
copy from spark/src/main/java/org/apache/iceberg/spark/source/SparkFileWriterFactory.java
copy to spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/source/SparkFileWriterFactory.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/source/SparkPartitionedFanoutWriter.java b/spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/source/SparkPartitionedFanoutWriter.java
similarity index 100%
copy from spark/src/main/java/org/apache/iceberg/spark/source/SparkPartitionedFanoutWriter.java
copy to spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/source/SparkPartitionedFanoutWriter.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/source/SparkPartitionedWriter.java b/spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/source/SparkPartitionedWriter.java
similarity index 100%
copy from spark/src/main/java/org/apache/iceberg/spark/source/SparkPartitionedWriter.java
copy to spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/source/SparkPartitionedWriter.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/source/StructInternalRow.java b/spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/source/StructInternalRow.java
similarity index 100%
copy from spark/src/main/java/org/apache/iceberg/spark/source/StructInternalRow.java
copy to spark/v2.4/spark2/src/main/java/org/apache/iceberg/spark/source/StructInternalRow.java
diff --git a/spark/src/test/java/org/apache/iceberg/KryoHelpers.java b/spark/v2.4/spark2/src/test/java/org/apache/iceberg/KryoHelpers.java
similarity index 100%
copy from spark/src/test/java/org/apache/iceberg/KryoHelpers.java
copy to spark/v2.4/spark2/src/test/java/org/apache/iceberg/KryoHelpers.java
diff --git a/spark/src/test/java/org/apache/iceberg/TaskCheckHelper.java b/spark/v2.4/spark2/src/test/java/org/apache/iceberg/TaskCheckHelper.java
similarity index 100%
copy from spark/src/test/java/org/apache/iceberg/TaskCheckHelper.java
copy to spark/v2.4/spark2/src/test/java/org/apache/iceberg/TaskCheckHelper.java
diff --git a/spark/src/test/java/org/apache/iceberg/TestDataFileSerialization.java b/spark/v2.4/spark2/src/test/java/org/apache/iceberg/TestDataFileSerialization.java
similarity index 100%
copy from spark/src/test/java/org/apache/iceberg/TestDataFileSerialization.java
copy to spark/v2.4/spark2/src/test/java/org/apache/iceberg/TestDataFileSerialization.java
diff --git a/spark/src/test/java/org/apache/iceberg/TestFileIOSerialization.java b/spark/v2.4/spark2/src/test/java/org/apache/iceberg/TestFileIOSerialization.java
similarity index 100%
copy from spark/src/test/java/org/apache/iceberg/TestFileIOSerialization.java
copy to spark/v2.4/spark2/src/test/java/org/apache/iceberg/TestFileIOSerialization.java
diff --git a/spark/src/test/java/org/apache/iceberg/TestManifestFileSerialization.java b/spark/v2.4/spark2/src/test/java/org/apache/iceberg/TestManifestFileSerialization.java
similarity index 100%
copy from spark/src/test/java/org/apache/iceberg/TestManifestFileSerialization.java
copy to spark/v2.4/spark2/src/test/java/org/apache/iceberg/TestManifestFileSerialization.java
diff --git a/spark/src/test/java/org/apache/iceberg/TestScanTaskSerialization.java b/spark/v2.4/spark2/src/test/java/org/apache/iceberg/TestScanTaskSerialization.java
similarity index 100%
copy from spark/src/test/java/org/apache/iceberg/TestScanTaskSerialization.java
copy to spark/v2.4/spark2/src/test/java/org/apache/iceberg/TestScanTaskSerialization.java
diff --git a/spark/src/test/java/org/apache/iceberg/TestTableSerialization.java b/spark/v2.4/spark2/src/test/java/org/apache/iceberg/TestTableSerialization.java
similarity index 100%
copy from spark/src/test/java/org/apache/iceberg/TestTableSerialization.java
copy to spark/v2.4/spark2/src/test/java/org/apache/iceberg/TestTableSerialization.java
diff --git a/spark/src/test/java/org/apache/iceberg/actions/TestDeleteReachableFilesAction.java b/spark/v2.4/spark2/src/test/java/org/apache/iceberg/actions/TestDeleteReachableFilesAction.java
similarity index 100%
copy from spark/src/test/java/org/apache/iceberg/actions/TestDeleteReachableFilesAction.java
copy to spark/v2.4/spark2/src/test/java/org/apache/iceberg/actions/TestDeleteReachableFilesAction.java
diff --git a/spark/src/test/java/org/apache/iceberg/actions/TestExpireSnapshotsAction.java b/spark/v2.4/spark2/src/test/java/org/apache/iceberg/actions/TestExpireSnapshotsAction.java
similarity index 100%
copy from spark/src/test/java/org/apache/iceberg/actions/TestExpireSnapshotsAction.java
copy to spark/v2.4/spark2/src/test/java/org/apache/iceberg/actions/TestExpireSnapshotsAction.java
diff --git a/spark/src/test/java/org/apache/iceberg/actions/TestRemoveOrphanFilesAction.java b/spark/v2.4/spark2/src/test/java/org/apache/iceberg/actions/TestRemoveOrphanFilesAction.java
similarity index 100%
copy from spark/src/test/java/org/apache/iceberg/actions/TestRemoveOrphanFilesAction.java
copy to spark/v2.4/spark2/src/test/java/org/apache/iceberg/actions/TestRemoveOrphanFilesAction.java
diff --git a/spark/src/test/java/org/apache/iceberg/actions/TestRewriteDataFilesAction.java b/spark/v2.4/spark2/src/test/java/org/apache/iceberg/actions/TestRewriteDataFilesAction.java
similarity index 100%
copy from spark/src/test/java/org/apache/iceberg/actions/TestRewriteDataFilesAction.java
copy to spark/v2.4/spark2/src/test/java/org/apache/iceberg/actions/TestRewriteDataFilesAction.java
diff --git a/spark/src/test/java/org/apache/iceberg/actions/TestRewriteManifestsAction.java b/spark/v2.4/spark2/src/test/java/org/apache/iceberg/actions/TestRewriteManifestsAction.java
similarity index 100%
copy from spark/src/test/java/org/apache/iceberg/actions/TestRewriteManifestsAction.java
copy to spark/v2.4/spark2/src/test/java/org/apache/iceberg/actions/TestRewriteManifestsAction.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/SparkTestBase.java b/spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/SparkTestBase.java
similarity index 100%
copy from spark/src/test/java/org/apache/iceberg/spark/SparkTestBase.java
copy to spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/SparkTestBase.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/TestSparkSchemaUtil.java b/spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/TestSparkSchemaUtil.java
similarity index 100%
copy from spark/src/test/java/org/apache/iceberg/spark/TestSparkSchemaUtil.java
copy to spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/TestSparkSchemaUtil.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/actions/TestNewRewriteDataFilesAction.java b/spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/actions/TestNewRewriteDataFilesAction.java
similarity index 100%
copy from spark/src/test/java/org/apache/iceberg/spark/actions/TestNewRewriteDataFilesAction.java
copy to spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/actions/TestNewRewriteDataFilesAction.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/data/AvroDataTest.java b/spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/data/AvroDataTest.java
similarity index 100%
copy from spark/src/test/java/org/apache/iceberg/spark/data/AvroDataTest.java
copy to spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/data/AvroDataTest.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/data/GenericsHelpers.java b/spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/data/GenericsHelpers.java
similarity index 100%
copy from spark/src/test/java/org/apache/iceberg/spark/data/GenericsHelpers.java
copy to spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/data/GenericsHelpers.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/data/RandomData.java b/spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/data/RandomData.java
similarity index 100%
copy from spark/src/test/java/org/apache/iceberg/spark/data/RandomData.java
copy to spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/data/RandomData.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/data/TestHelpers.java b/spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/data/TestHelpers.java
similarity index 100%
copy from spark/src/test/java/org/apache/iceberg/spark/data/TestHelpers.java
copy to spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/data/TestHelpers.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/data/TestOrcWrite.java b/spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/data/TestOrcWrite.java
similarity index 100%
copy from spark/src/test/java/org/apache/iceberg/spark/data/TestOrcWrite.java
copy to spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/data/TestOrcWrite.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/data/TestParquetAvroReader.java b/spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/data/TestParquetAvroReader.java
similarity index 100%
copy from spark/src/test/java/org/apache/iceberg/spark/data/TestParquetAvroReader.java
copy to spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/data/TestParquetAvroReader.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/data/TestParquetAvroWriter.java b/spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/data/TestParquetAvroWriter.java
similarity index 100%
copy from spark/src/test/java/org/apache/iceberg/spark/data/TestParquetAvroWriter.java
copy to spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/data/TestParquetAvroWriter.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/data/TestSparkAvroEnums.java b/spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/data/TestSparkAvroEnums.java
similarity index 100%
copy from spark/src/test/java/org/apache/iceberg/spark/data/TestSparkAvroEnums.java
copy to spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/data/TestSparkAvroEnums.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/data/TestSparkAvroReader.java b/spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/data/TestSparkAvroReader.java
similarity index 100%
copy from spark/src/test/java/org/apache/iceberg/spark/data/TestSparkAvroReader.java
copy to spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/data/TestSparkAvroReader.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/data/TestSparkDateTimes.java b/spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/data/TestSparkDateTimes.java
similarity index 100%
copy from spark/src/test/java/org/apache/iceberg/spark/data/TestSparkDateTimes.java
copy to spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/data/TestSparkDateTimes.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/data/TestSparkOrcReadMetadataColumns.java b/spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/data/TestSparkOrcReadMetadataColumns.java
similarity index 100%
copy from spark/src/test/java/org/apache/iceberg/spark/data/TestSparkOrcReadMetadataColumns.java
copy to spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/data/TestSparkOrcReadMetadataColumns.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/data/TestSparkOrcReader.java b/spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/data/TestSparkOrcReader.java
similarity index 100%
copy from spark/src/test/java/org/apache/iceberg/spark/data/TestSparkOrcReader.java
copy to spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/data/TestSparkOrcReader.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/data/TestSparkParquetReadMetadataColumns.java b/spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/data/TestSparkParquetReadMetadataColumns.java
similarity index 100%
copy from spark/src/test/java/org/apache/iceberg/spark/data/TestSparkParquetReadMetadataColumns.java
copy to spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/data/TestSparkParquetReadMetadataColumns.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/data/TestSparkParquetReader.java b/spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/data/TestSparkParquetReader.java
similarity index 100%
copy from spark/src/test/java/org/apache/iceberg/spark/data/TestSparkParquetReader.java
copy to spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/data/TestSparkParquetReader.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/data/TestSparkParquetWriter.java b/spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/data/TestSparkParquetWriter.java
similarity index 100%
copy from spark/src/test/java/org/apache/iceberg/spark/data/TestSparkParquetWriter.java
copy to spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/data/TestSparkParquetWriter.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/data/TestSparkRecordOrcReaderWriter.java b/spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/data/TestSparkRecordOrcReaderWriter.java
similarity index 100%
copy from spark/src/test/java/org/apache/iceberg/spark/data/TestSparkRecordOrcReaderWriter.java
copy to spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/data/TestSparkRecordOrcReaderWriter.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/data/parquet/vectorized/TestParquetDictionaryEncodedVectorizedReads.java b/spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/data/parquet/vectorized/TestParquetDictionaryEncodedVectorizedReads.java
similarity index 100%
copy from spark/src/test/java/org/apache/iceberg/spark/data/parquet/vectorized/TestParquetDictionaryEncodedVectorizedReads.java
copy to spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/data/parquet/vectorized/TestParquetDictionaryEncodedVectorizedReads.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/data/parquet/vectorized/TestParquetDictionaryFallbackToPlainEncodingVectorizedReads.java b/spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/data/parquet/vectorized/TestParquetDictionaryFallbackToPlainEncodingVectorizedReads.java
similarity index 100%
copy from spark/src/test/java/org/apache/iceberg/spark/data/parquet/vectorized/TestParquetDictionaryFallbackToPlainEncodingVectorizedReads.java
copy to spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/data/parquet/vectorized/TestParquetDictionaryFallbackToPlainEncodingVectorizedReads.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/data/parquet/vectorized/TestParquetVectorizedReads.java b/spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/data/parquet/vectorized/TestParquetVectorizedReads.java
similarity index 100%
copy from spark/src/test/java/org/apache/iceberg/spark/data/parquet/vectorized/TestParquetVectorizedReads.java
copy to spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/data/parquet/vectorized/TestParquetVectorizedReads.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/source/LogMessage.java b/spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/source/LogMessage.java
similarity index 100%
copy from spark/src/test/java/org/apache/iceberg/spark/source/LogMessage.java
copy to spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/source/LogMessage.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/source/SimpleRecord.java b/spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/source/SimpleRecord.java
similarity index 100%
copy from spark/src/test/java/org/apache/iceberg/spark/source/SimpleRecord.java
copy to spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/source/SimpleRecord.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/source/TestAvroScan.java b/spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/source/TestAvroScan.java
similarity index 100%
copy from spark/src/test/java/org/apache/iceberg/spark/source/TestAvroScan.java
copy to spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/source/TestAvroScan.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/source/TestDataFrameWrites.java b/spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/source/TestDataFrameWrites.java
similarity index 100%
copy from spark/src/test/java/org/apache/iceberg/spark/source/TestDataFrameWrites.java
copy to spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/source/TestDataFrameWrites.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/source/TestDataSourceOptions.java b/spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/source/TestDataSourceOptions.java
similarity index 100%
copy from spark/src/test/java/org/apache/iceberg/spark/source/TestDataSourceOptions.java
copy to spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/source/TestDataSourceOptions.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/source/TestForwardCompatibility.java b/spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/source/TestForwardCompatibility.java
similarity index 100%
copy from spark/src/test/java/org/apache/iceberg/spark/source/TestForwardCompatibility.java
copy to spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/source/TestForwardCompatibility.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/source/TestIcebergSourceHadoopTables.java b/spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/source/TestIcebergSourceHadoopTables.java
similarity index 100%
copy from spark/src/test/java/org/apache/iceberg/spark/source/TestIcebergSourceHadoopTables.java
copy to spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/source/TestIcebergSourceHadoopTables.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/source/TestIcebergSourceHiveTables.java b/spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/source/TestIcebergSourceHiveTables.java
similarity index 100%
copy from spark/src/test/java/org/apache/iceberg/spark/source/TestIcebergSourceHiveTables.java
copy to spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/source/TestIcebergSourceHiveTables.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/source/TestIcebergSourceTablesBase.java b/spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/source/TestIcebergSourceTablesBase.java
similarity index 100%
copy from spark/src/test/java/org/apache/iceberg/spark/source/TestIcebergSourceTablesBase.java
copy to spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/source/TestIcebergSourceTablesBase.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/source/TestIcebergSpark.java b/spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/source/TestIcebergSpark.java
similarity index 100%
copy from spark/src/test/java/org/apache/iceberg/spark/source/TestIcebergSpark.java
copy to spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/source/TestIcebergSpark.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/source/TestIdentityPartitionData.java b/spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/source/TestIdentityPartitionData.java
similarity index 100%
copy from spark/src/test/java/org/apache/iceberg/spark/source/TestIdentityPartitionData.java
copy to spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/source/TestIdentityPartitionData.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/source/TestInternalRowWrapper.java b/spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/source/TestInternalRowWrapper.java
similarity index 100%
copy from spark/src/test/java/org/apache/iceberg/spark/source/TestInternalRowWrapper.java
copy to spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/source/TestInternalRowWrapper.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/source/TestParquetScan.java b/spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/source/TestParquetScan.java
similarity index 100%
copy from spark/src/test/java/org/apache/iceberg/spark/source/TestParquetScan.java
copy to spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/source/TestParquetScan.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/source/TestPartitionPruning.java b/spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/source/TestPartitionPruning.java
similarity index 100%
copy from spark/src/test/java/org/apache/iceberg/spark/source/TestPartitionPruning.java
copy to spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/source/TestPartitionPruning.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/source/TestPartitionValues.java b/spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/source/TestPartitionValues.java
similarity index 100%
copy from spark/src/test/java/org/apache/iceberg/spark/source/TestPartitionValues.java
copy to spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/source/TestPartitionValues.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/source/TestReadProjection.java b/spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/source/TestReadProjection.java
similarity index 100%
copy from spark/src/test/java/org/apache/iceberg/spark/source/TestReadProjection.java
copy to spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/source/TestReadProjection.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/source/TestSnapshotSelection.java b/spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/source/TestSnapshotSelection.java
similarity index 100%
copy from spark/src/test/java/org/apache/iceberg/spark/source/TestSnapshotSelection.java
copy to spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/source/TestSnapshotSelection.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/source/TestSparkAppenderFactory.java b/spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/source/TestSparkAppenderFactory.java
similarity index 100%
copy from spark/src/test/java/org/apache/iceberg/spark/source/TestSparkAppenderFactory.java
copy to spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/source/TestSparkAppenderFactory.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/source/TestSparkBaseDataReader.java b/spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/source/TestSparkBaseDataReader.java
similarity index 100%
copy from spark/src/test/java/org/apache/iceberg/spark/source/TestSparkBaseDataReader.java
copy to spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/source/TestSparkBaseDataReader.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/source/TestSparkDataFile.java b/spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/source/TestSparkDataFile.java
similarity index 100%
copy from spark/src/test/java/org/apache/iceberg/spark/source/TestSparkDataFile.java
copy to spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/source/TestSparkDataFile.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/source/TestSparkDataWrite.java b/spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/source/TestSparkDataWrite.java
similarity index 100%
copy from spark/src/test/java/org/apache/iceberg/spark/source/TestSparkDataWrite.java
copy to spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/source/TestSparkDataWrite.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/source/TestSparkFileWriterFactory.java b/spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/source/TestSparkFileWriterFactory.java
similarity index 100%
copy from spark/src/test/java/org/apache/iceberg/spark/source/TestSparkFileWriterFactory.java
copy to spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/source/TestSparkFileWriterFactory.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/source/TestSparkMergingMetrics.java b/spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/source/TestSparkMergingMetrics.java
similarity index 100%
copy from spark/src/test/java/org/apache/iceberg/spark/source/TestSparkMergingMetrics.java
copy to spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/source/TestSparkMergingMetrics.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/source/TestSparkPartitioningWriters.java b/spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/source/TestSparkPartitioningWriters.java
similarity index 100%
copy from spark/src/test/java/org/apache/iceberg/spark/source/TestSparkPartitioningWriters.java
copy to spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/source/TestSparkPartitioningWriters.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/source/TestSparkPositionDeltaWriters.java b/spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/source/TestSparkPositionDeltaWriters.java
similarity index 100%
copy from spark/src/test/java/org/apache/iceberg/spark/source/TestSparkPositionDeltaWriters.java
copy to spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/source/TestSparkPositionDeltaWriters.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/source/TestSparkReadProjection.java b/spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/source/TestSparkReadProjection.java
similarity index 100%
copy from spark/src/test/java/org/apache/iceberg/spark/source/TestSparkReadProjection.java
copy to spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/source/TestSparkReadProjection.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/source/TestSparkReaderDeletes.java b/spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/source/TestSparkReaderDeletes.java
similarity index 100%
copy from spark/src/test/java/org/apache/iceberg/spark/source/TestSparkReaderDeletes.java
copy to spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/source/TestSparkReaderDeletes.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/source/TestSparkRollingFileWriters.java b/spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/source/TestSparkRollingFileWriters.java
similarity index 100%
copy from spark/src/test/java/org/apache/iceberg/spark/source/TestSparkRollingFileWriters.java
copy to spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/source/TestSparkRollingFileWriters.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/source/TestSparkSchema.java b/spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/source/TestSparkSchema.java
similarity index 100%
copy from spark/src/test/java/org/apache/iceberg/spark/source/TestSparkSchema.java
copy to spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/source/TestSparkSchema.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/source/TestSparkWriterMetrics.java b/spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/source/TestSparkWriterMetrics.java
similarity index 100%
copy from spark/src/test/java/org/apache/iceberg/spark/source/TestSparkWriterMetrics.java
copy to spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/source/TestSparkWriterMetrics.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/source/TestStructuredStreaming.java b/spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/source/TestStructuredStreaming.java
similarity index 100%
copy from spark/src/test/java/org/apache/iceberg/spark/source/TestStructuredStreaming.java
copy to spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/source/TestStructuredStreaming.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/source/TestTables.java b/spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/source/TestTables.java
similarity index 100%
copy from spark/src/test/java/org/apache/iceberg/spark/source/TestTables.java
copy to spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/source/TestTables.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/source/TestTimestampWithoutZone.java b/spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/source/TestTimestampWithoutZone.java
similarity index 100%
copy from spark/src/test/java/org/apache/iceberg/spark/source/TestTimestampWithoutZone.java
copy to spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/source/TestTimestampWithoutZone.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/source/TestWriteMetricsConfig.java b/spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/source/TestWriteMetricsConfig.java
similarity index 100%
copy from spark/src/test/java/org/apache/iceberg/spark/source/TestWriteMetricsConfig.java
copy to spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/source/TestWriteMetricsConfig.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/source/ThreeColumnRecord.java b/spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/source/ThreeColumnRecord.java
similarity index 100%
copy from spark/src/test/java/org/apache/iceberg/spark/source/ThreeColumnRecord.java
copy to spark/v2.4/spark2/src/test/java/org/apache/iceberg/spark/source/ThreeColumnRecord.java
diff --git a/spark/v3.0/build.gradle b/spark/v3.0/build.gradle
index 43dc13d..ef9a99b 100644
--- a/spark/v3.0/build.gradle
+++ b/spark/v3.0/build.gradle
@@ -37,27 +37,34 @@ project(':iceberg-spark:iceberg-spark3') {
     implementation project(':iceberg-parquet')
     implementation project(':iceberg-arrow')
     implementation project(':iceberg-hive-metastore')
-    implementation project(':iceberg-spark')
 
+    compileOnly "com.google.errorprone:error_prone_annotations"
     compileOnly "org.apache.avro:avro"
     compileOnly("org.apache.spark:spark-hive_2.12:${project.ext.Spark30Version}") {
       exclude group: 'org.apache.avro', module: 'avro'
       exclude group: 'org.apache.arrow'
     }
 
+    implementation("org.apache.orc:orc-core::nohive") {
+      exclude group: 'org.apache.hadoop'
+      exclude group: 'commons-lang'
+      // These artifacts are shaded and included in the orc-core fat jar
+      exclude group: 'com.google.protobuf', module: 'protobuf-java'
+      exclude group: 'org.apache.hive', module: 'hive-storage-api'
+    }
+
     implementation("org.apache.arrow:arrow-vector") {
       exclude group: 'io.netty', module: 'netty-buffer'
       exclude group: 'io.netty', module: 'netty-common'
       exclude group: 'com.google.code.findbugs', module: 'jsr305'
     }
 
-    testImplementation project(path: ':iceberg-spark', configuration: 'testArtifacts')
-
     testImplementation("org.apache.hadoop:hadoop-minicluster") {
       exclude group: 'org.apache.avro', module: 'avro'
     }
     testImplementation project(path: ':iceberg-hive-metastore', configuration: 'testArtifacts')
     testImplementation project(path: ':iceberg-api', configuration: 'testArtifacts')
+    testImplementation project(path: ':iceberg-core', configuration: 'testArtifacts')
     testImplementation project(path: ':iceberg-data', configuration: 'testArtifacts')
     testImplementation "org.xerial:sqlite-jdbc"
   }
diff --git a/spark/src/jmh/java/org/apache/iceberg/spark/SparkBenchmarkUtil.java b/spark/v3.0/spark3/src/jmh/java/org/apache/iceberg/spark/SparkBenchmarkUtil.java
similarity index 100%
rename from spark/src/jmh/java/org/apache/iceberg/spark/SparkBenchmarkUtil.java
rename to spark/v3.0/spark3/src/jmh/java/org/apache/iceberg/spark/SparkBenchmarkUtil.java
diff --git a/spark/src/jmh/java/org/apache/iceberg/spark/data/parquet/SparkParquetReadersFlatDataBenchmark.java b/spark/v3.0/spark3/src/jmh/java/org/apache/iceberg/spark/data/parquet/SparkParquetReadersFlatDataBenchmark.java
similarity index 100%
rename from spark/src/jmh/java/org/apache/iceberg/spark/data/parquet/SparkParquetReadersFlatDataBenchmark.java
rename to spark/v3.0/spark3/src/jmh/java/org/apache/iceberg/spark/data/parquet/SparkParquetReadersFlatDataBenchmark.java
diff --git a/spark/src/jmh/java/org/apache/iceberg/spark/data/parquet/SparkParquetReadersNestedDataBenchmark.java b/spark/v3.0/spark3/src/jmh/java/org/apache/iceberg/spark/data/parquet/SparkParquetReadersNestedDataBenchmark.java
similarity index 100%
rename from spark/src/jmh/java/org/apache/iceberg/spark/data/parquet/SparkParquetReadersNestedDataBenchmark.java
rename to spark/v3.0/spark3/src/jmh/java/org/apache/iceberg/spark/data/parquet/SparkParquetReadersNestedDataBenchmark.java
diff --git a/spark/src/jmh/java/org/apache/iceberg/spark/data/parquet/SparkParquetWritersFlatDataBenchmark.java b/spark/v3.0/spark3/src/jmh/java/org/apache/iceberg/spark/data/parquet/SparkParquetWritersFlatDataBenchmark.java
similarity index 100%
rename from spark/src/jmh/java/org/apache/iceberg/spark/data/parquet/SparkParquetWritersFlatDataBenchmark.java
rename to spark/v3.0/spark3/src/jmh/java/org/apache/iceberg/spark/data/parquet/SparkParquetWritersFlatDataBenchmark.java
diff --git a/spark/src/jmh/java/org/apache/iceberg/spark/data/parquet/SparkParquetWritersNestedDataBenchmark.java b/spark/v3.0/spark3/src/jmh/java/org/apache/iceberg/spark/data/parquet/SparkParquetWritersNestedDataBenchmark.java
similarity index 100%
rename from spark/src/jmh/java/org/apache/iceberg/spark/data/parquet/SparkParquetWritersNestedDataBenchmark.java
rename to spark/v3.0/spark3/src/jmh/java/org/apache/iceberg/spark/data/parquet/SparkParquetWritersNestedDataBenchmark.java
diff --git a/spark/src/jmh/java/org/apache/iceberg/spark/source/Action.java b/spark/v3.0/spark3/src/jmh/java/org/apache/iceberg/spark/source/Action.java
similarity index 100%
rename from spark/src/jmh/java/org/apache/iceberg/spark/source/Action.java
rename to spark/v3.0/spark3/src/jmh/java/org/apache/iceberg/spark/source/Action.java
diff --git a/spark/src/jmh/java/org/apache/iceberg/spark/source/IcebergSourceBenchmark.java b/spark/v3.0/spark3/src/jmh/java/org/apache/iceberg/spark/source/IcebergSourceBenchmark.java
similarity index 100%
rename from spark/src/jmh/java/org/apache/iceberg/spark/source/IcebergSourceBenchmark.java
rename to spark/v3.0/spark3/src/jmh/java/org/apache/iceberg/spark/source/IcebergSourceBenchmark.java
diff --git a/spark/src/jmh/java/org/apache/iceberg/spark/source/IcebergSourceFlatDataBenchmark.java b/spark/v3.0/spark3/src/jmh/java/org/apache/iceberg/spark/source/IcebergSourceFlatDataBenchmark.java
similarity index 100%
rename from spark/src/jmh/java/org/apache/iceberg/spark/source/IcebergSourceFlatDataBenchmark.java
rename to spark/v3.0/spark3/src/jmh/java/org/apache/iceberg/spark/source/IcebergSourceFlatDataBenchmark.java
diff --git a/spark/src/jmh/java/org/apache/iceberg/spark/source/IcebergSourceNestedDataBenchmark.java b/spark/v3.0/spark3/src/jmh/java/org/apache/iceberg/spark/source/IcebergSourceNestedDataBenchmark.java
similarity index 100%
rename from spark/src/jmh/java/org/apache/iceberg/spark/source/IcebergSourceNestedDataBenchmark.java
rename to spark/v3.0/spark3/src/jmh/java/org/apache/iceberg/spark/source/IcebergSourceNestedDataBenchmark.java
diff --git a/spark/src/jmh/java/org/apache/iceberg/spark/source/IcebergSourceNestedListDataBenchmark.java b/spark/v3.0/spark3/src/jmh/java/org/apache/iceberg/spark/source/IcebergSourceNestedListDataBenchmark.java
similarity index 100%
rename from spark/src/jmh/java/org/apache/iceberg/spark/source/IcebergSourceNestedListDataBenchmark.java
rename to spark/v3.0/spark3/src/jmh/java/org/apache/iceberg/spark/source/IcebergSourceNestedListDataBenchmark.java
diff --git a/spark/src/jmh/java/org/apache/iceberg/spark/source/WritersBenchmark.java b/spark/v3.0/spark3/src/jmh/java/org/apache/iceberg/spark/source/WritersBenchmark.java
similarity index 100%
rename from spark/src/jmh/java/org/apache/iceberg/spark/source/WritersBenchmark.java
rename to spark/v3.0/spark3/src/jmh/java/org/apache/iceberg/spark/source/WritersBenchmark.java
diff --git a/spark/src/jmh/java/org/apache/iceberg/spark/source/avro/AvroWritersBenchmark.java b/spark/v3.0/spark3/src/jmh/java/org/apache/iceberg/spark/source/avro/AvroWritersBenchmark.java
similarity index 100%
rename from spark/src/jmh/java/org/apache/iceberg/spark/source/avro/AvroWritersBenchmark.java
rename to spark/v3.0/spark3/src/jmh/java/org/apache/iceberg/spark/source/avro/AvroWritersBenchmark.java
diff --git a/spark/src/jmh/java/org/apache/iceberg/spark/source/avro/IcebergSourceFlatAvroDataReadBenchmark.java b/spark/v3.0/spark3/src/jmh/java/org/apache/iceberg/spark/source/avro/IcebergSourceFlatAvroDataReadBenchmark.java
similarity index 100%
rename from spark/src/jmh/java/org/apache/iceberg/spark/source/avro/IcebergSourceFlatAvroDataReadBenchmark.java
rename to spark/v3.0/spark3/src/jmh/java/org/apache/iceberg/spark/source/avro/IcebergSourceFlatAvroDataReadBenchmark.java
diff --git a/spark/src/jmh/java/org/apache/iceberg/spark/source/avro/IcebergSourceNestedAvroDataReadBenchmark.java b/spark/v3.0/spark3/src/jmh/java/org/apache/iceberg/spark/source/avro/IcebergSourceNestedAvroDataReadBenchmark.java
similarity index 100%
rename from spark/src/jmh/java/org/apache/iceberg/spark/source/avro/IcebergSourceNestedAvroDataReadBenchmark.java
rename to spark/v3.0/spark3/src/jmh/java/org/apache/iceberg/spark/source/avro/IcebergSourceNestedAvroDataReadBenchmark.java
diff --git a/spark/src/jmh/java/org/apache/iceberg/spark/source/orc/IcebergSourceFlatORCDataBenchmark.java b/spark/v3.0/spark3/src/jmh/java/org/apache/iceberg/spark/source/orc/IcebergSourceFlatORCDataBenchmark.java
similarity index 100%
rename from spark/src/jmh/java/org/apache/iceberg/spark/source/orc/IcebergSourceFlatORCDataBenchmark.java
rename to spark/v3.0/spark3/src/jmh/java/org/apache/iceberg/spark/source/orc/IcebergSourceFlatORCDataBenchmark.java
diff --git a/spark/src/jmh/java/org/apache/iceberg/spark/source/orc/IcebergSourceFlatORCDataReadBenchmark.java b/spark/v3.0/spark3/src/jmh/java/org/apache/iceberg/spark/source/orc/IcebergSourceFlatORCDataReadBenchmark.java
similarity index 100%
rename from spark/src/jmh/java/org/apache/iceberg/spark/source/orc/IcebergSourceFlatORCDataReadBenchmark.java
rename to spark/v3.0/spark3/src/jmh/java/org/apache/iceberg/spark/source/orc/IcebergSourceFlatORCDataReadBenchmark.java
diff --git a/spark/src/jmh/java/org/apache/iceberg/spark/source/orc/IcebergSourceNestedListORCDataWriteBenchmark.java b/spark/v3.0/spark3/src/jmh/java/org/apache/iceberg/spark/source/orc/IcebergSourceNestedListORCDataWriteBenchmark.java
similarity index 100%
rename from spark/src/jmh/java/org/apache/iceberg/spark/source/orc/IcebergSourceNestedListORCDataWriteBenchmark.java
rename to spark/v3.0/spark3/src/jmh/java/org/apache/iceberg/spark/source/orc/IcebergSourceNestedListORCDataWriteBenchmark.java
diff --git a/spark/src/jmh/java/org/apache/iceberg/spark/source/orc/IcebergSourceNestedORCDataReadBenchmark.java b/spark/v3.0/spark3/src/jmh/java/org/apache/iceberg/spark/source/orc/IcebergSourceNestedORCDataReadBenchmark.java
similarity index 100%
rename from spark/src/jmh/java/org/apache/iceberg/spark/source/orc/IcebergSourceNestedORCDataReadBenchmark.java
rename to spark/v3.0/spark3/src/jmh/java/org/apache/iceberg/spark/source/orc/IcebergSourceNestedORCDataReadBenchmark.java
diff --git a/spark/src/jmh/java/org/apache/iceberg/spark/source/parquet/IcebergSourceFlatParquetDataFilterBenchmark.java b/spark/v3.0/spark3/src/jmh/java/org/apache/iceberg/spark/source/parquet/IcebergSourceFlatParquetDataFilterBenchmark.java
similarity index 100%
rename from spark/src/jmh/java/org/apache/iceberg/spark/source/parquet/IcebergSourceFlatParquetDataFilterBenchmark.java
rename to spark/v3.0/spark3/src/jmh/java/org/apache/iceberg/spark/source/parquet/IcebergSourceFlatParquetDataFilterBenchmark.java
diff --git a/spark/src/jmh/java/org/apache/iceberg/spark/source/parquet/IcebergSourceFlatParquetDataReadBenchmark.java b/spark/v3.0/spark3/src/jmh/java/org/apache/iceberg/spark/source/parquet/IcebergSourceFlatParquetDataReadBenchmark.java
similarity index 100%
rename from spark/src/jmh/java/org/apache/iceberg/spark/source/parquet/IcebergSourceFlatParquetDataReadBenchmark.java
rename to spark/v3.0/spark3/src/jmh/java/org/apache/iceberg/spark/source/parquet/IcebergSourceFlatParquetDataReadBenchmark.java
diff --git a/spark/src/jmh/java/org/apache/iceberg/spark/source/parquet/IcebergSourceFlatParquetDataWriteBenchmark.java b/spark/v3.0/spark3/src/jmh/java/org/apache/iceberg/spark/source/parquet/IcebergSourceFlatParquetDataWriteBenchmark.java
similarity index 100%
rename from spark/src/jmh/java/org/apache/iceberg/spark/source/parquet/IcebergSourceFlatParquetDataWriteBenchmark.java
rename to spark/v3.0/spark3/src/jmh/java/org/apache/iceberg/spark/source/parquet/IcebergSourceFlatParquetDataWriteBenchmark.java
diff --git a/spark/src/jmh/java/org/apache/iceberg/spark/source/parquet/IcebergSourceNestedListParquetDataWriteBenchmark.java b/spark/v3.0/spark3/src/jmh/java/org/apache/iceberg/spark/source/parquet/IcebergSourceNestedListParquetDataWriteBenchmark.java
similarity index 100%
rename from spark/src/jmh/java/org/apache/iceberg/spark/source/parquet/IcebergSourceNestedListParquetDataWriteBenchmark.java
rename to spark/v3.0/spark3/src/jmh/java/org/apache/iceberg/spark/source/parquet/IcebergSourceNestedListParquetDataWriteBenchmark.java
diff --git a/spark/src/jmh/java/org/apache/iceberg/spark/source/parquet/IcebergSourceNestedParquetDataFilterBenchmark.java b/spark/v3.0/spark3/src/jmh/java/org/apache/iceberg/spark/source/parquet/IcebergSourceNestedParquetDataFilterBenchmark.java
similarity index 100%
rename from spark/src/jmh/java/org/apache/iceberg/spark/source/parquet/IcebergSourceNestedParquetDataFilterBenchmark.java
rename to spark/v3.0/spark3/src/jmh/java/org/apache/iceberg/spark/source/parquet/IcebergSourceNestedParquetDataFilterBenchmark.java
diff --git a/spark/src/jmh/java/org/apache/iceberg/spark/source/parquet/IcebergSourceNestedParquetDataReadBenchmark.java b/spark/v3.0/spark3/src/jmh/java/org/apache/iceberg/spark/source/parquet/IcebergSourceNestedParquetDataReadBenchmark.java
similarity index 100%
rename from spark/src/jmh/java/org/apache/iceberg/spark/source/parquet/IcebergSourceNestedParquetDataReadBenchmark.java
rename to spark/v3.0/spark3/src/jmh/java/org/apache/iceberg/spark/source/parquet/IcebergSourceNestedParquetDataReadBenchmark.java
diff --git a/spark/src/jmh/java/org/apache/iceberg/spark/source/parquet/IcebergSourceNestedParquetDataWriteBenchmark.java b/spark/v3.0/spark3/src/jmh/java/org/apache/iceberg/spark/source/parquet/IcebergSourceNestedParquetDataWriteBenchmark.java
similarity index 100%
rename from spark/src/jmh/java/org/apache/iceberg/spark/source/parquet/IcebergSourceNestedParquetDataWriteBenchmark.java
rename to spark/v3.0/spark3/src/jmh/java/org/apache/iceberg/spark/source/parquet/IcebergSourceNestedParquetDataWriteBenchmark.java
diff --git a/spark/src/jmh/java/org/apache/iceberg/spark/source/parquet/ParquetWritersBenchmark.java b/spark/v3.0/spark3/src/jmh/java/org/apache/iceberg/spark/source/parquet/ParquetWritersBenchmark.java
similarity index 100%
rename from spark/src/jmh/java/org/apache/iceberg/spark/source/parquet/ParquetWritersBenchmark.java
rename to spark/v3.0/spark3/src/jmh/java/org/apache/iceberg/spark/source/parquet/ParquetWritersBenchmark.java
diff --git a/spark/src/jmh/java/org/apache/iceberg/spark/source/parquet/vectorized/VectorizedReadDictionaryEncodedFlatParquetDataBenchmark.java b/spark/v3.0/spark3/src/jmh/java/org/apache/iceberg/spark/source/parquet/vectorized/VectorizedReadDictionaryEncodedFlatParquetDataBenchmark.java
similarity index 100%
rename from spark/src/jmh/java/org/apache/iceberg/spark/source/parquet/vectorized/VectorizedReadDictionaryEncodedFlatParquetDataBenchmark.java
rename to spark/v3.0/spark3/src/jmh/java/org/apache/iceberg/spark/source/parquet/vectorized/VectorizedReadDictionaryEncodedFlatParquetDataBenchmark.java
diff --git a/spark/src/jmh/java/org/apache/iceberg/spark/source/parquet/vectorized/VectorizedReadFlatParquetDataBenchmark.java b/spark/v3.0/spark3/src/jmh/java/org/apache/iceberg/spark/source/parquet/vectorized/VectorizedReadFlatParquetDataBenchmark.java
similarity index 100%
rename from spark/src/jmh/java/org/apache/iceberg/spark/source/parquet/vectorized/VectorizedReadFlatParquetDataBenchmark.java
rename to spark/v3.0/spark3/src/jmh/java/org/apache/iceberg/spark/source/parquet/vectorized/VectorizedReadFlatParquetDataBenchmark.java
diff --git a/spark/src/main/java/org/apache/iceberg/actions/Actions.java b/spark/v3.0/spark3/src/main/java/org/apache/iceberg/actions/Actions.java
similarity index 100%
rename from spark/src/main/java/org/apache/iceberg/actions/Actions.java
rename to spark/v3.0/spark3/src/main/java/org/apache/iceberg/actions/Actions.java
diff --git a/spark/src/main/java/org/apache/iceberg/actions/CreateAction.java b/spark/v3.0/spark3/src/main/java/org/apache/iceberg/actions/CreateAction.java
similarity index 100%
rename from spark/src/main/java/org/apache/iceberg/actions/CreateAction.java
rename to spark/v3.0/spark3/src/main/java/org/apache/iceberg/actions/CreateAction.java
diff --git a/spark/src/main/java/org/apache/iceberg/actions/ExpireSnapshotsAction.java b/spark/v3.0/spark3/src/main/java/org/apache/iceberg/actions/ExpireSnapshotsAction.java
similarity index 100%
rename from spark/src/main/java/org/apache/iceberg/actions/ExpireSnapshotsAction.java
rename to spark/v3.0/spark3/src/main/java/org/apache/iceberg/actions/ExpireSnapshotsAction.java
diff --git a/spark/src/main/java/org/apache/iceberg/actions/ExpireSnapshotsActionResult.java b/spark/v3.0/spark3/src/main/java/org/apache/iceberg/actions/ExpireSnapshotsActionResult.java
similarity index 100%
rename from spark/src/main/java/org/apache/iceberg/actions/ExpireSnapshotsActionResult.java
rename to spark/v3.0/spark3/src/main/java/org/apache/iceberg/actions/ExpireSnapshotsActionResult.java
diff --git a/spark/src/main/java/org/apache/iceberg/actions/ManifestFileBean.java b/spark/v3.0/spark3/src/main/java/org/apache/iceberg/actions/ManifestFileBean.java
similarity index 100%
rename from spark/src/main/java/org/apache/iceberg/actions/ManifestFileBean.java
rename to spark/v3.0/spark3/src/main/java/org/apache/iceberg/actions/ManifestFileBean.java
diff --git a/spark/src/main/java/org/apache/iceberg/actions/RemoveOrphanFilesAction.java b/spark/v3.0/spark3/src/main/java/org/apache/iceberg/actions/RemoveOrphanFilesAction.java
similarity index 100%
rename from spark/src/main/java/org/apache/iceberg/actions/RemoveOrphanFilesAction.java
rename to spark/v3.0/spark3/src/main/java/org/apache/iceberg/actions/RemoveOrphanFilesAction.java
diff --git a/spark/src/main/java/org/apache/iceberg/actions/RewriteDataFilesAction.java b/spark/v3.0/spark3/src/main/java/org/apache/iceberg/actions/RewriteDataFilesAction.java
similarity index 100%
rename from spark/src/main/java/org/apache/iceberg/actions/RewriteDataFilesAction.java
rename to spark/v3.0/spark3/src/main/java/org/apache/iceberg/actions/RewriteDataFilesAction.java
diff --git a/spark/src/main/java/org/apache/iceberg/actions/RewriteManifestsAction.java b/spark/v3.0/spark3/src/main/java/org/apache/iceberg/actions/RewriteManifestsAction.java
similarity index 100%
rename from spark/src/main/java/org/apache/iceberg/actions/RewriteManifestsAction.java
rename to spark/v3.0/spark3/src/main/java/org/apache/iceberg/actions/RewriteManifestsAction.java
diff --git a/spark/src/main/java/org/apache/iceberg/actions/RewriteManifestsActionResult.java b/spark/v3.0/spark3/src/main/java/org/apache/iceberg/actions/RewriteManifestsActionResult.java
similarity index 100%
rename from spark/src/main/java/org/apache/iceberg/actions/RewriteManifestsActionResult.java
rename to spark/v3.0/spark3/src/main/java/org/apache/iceberg/actions/RewriteManifestsActionResult.java
diff --git a/spark/src/main/java/org/apache/iceberg/actions/SnapshotAction.java b/spark/v3.0/spark3/src/main/java/org/apache/iceberg/actions/SnapshotAction.java
similarity index 100%
rename from spark/src/main/java/org/apache/iceberg/actions/SnapshotAction.java
rename to spark/v3.0/spark3/src/main/java/org/apache/iceberg/actions/SnapshotAction.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/IcebergSpark.java b/spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/IcebergSpark.java
similarity index 100%
rename from spark/src/main/java/org/apache/iceberg/spark/IcebergSpark.java
rename to spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/IcebergSpark.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/JobGroupInfo.java b/spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/JobGroupInfo.java
similarity index 100%
rename from spark/src/main/java/org/apache/iceberg/spark/JobGroupInfo.java
rename to spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/JobGroupInfo.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/JobGroupUtils.java b/spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/JobGroupUtils.java
similarity index 100%
rename from spark/src/main/java/org/apache/iceberg/spark/JobGroupUtils.java
rename to spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/JobGroupUtils.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/PruneColumnsWithReordering.java b/spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/PruneColumnsWithReordering.java
similarity index 100%
rename from spark/src/main/java/org/apache/iceberg/spark/PruneColumnsWithReordering.java
rename to spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/PruneColumnsWithReordering.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/PruneColumnsWithoutReordering.java b/spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/PruneColumnsWithoutReordering.java
similarity index 100%
rename from spark/src/main/java/org/apache/iceberg/spark/PruneColumnsWithoutReordering.java
rename to spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/PruneColumnsWithoutReordering.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/SparkConfParser.java b/spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/SparkConfParser.java
similarity index 100%
rename from spark/src/main/java/org/apache/iceberg/spark/SparkConfParser.java
rename to spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/SparkConfParser.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/SparkDataFile.java b/spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/SparkDataFile.java
similarity index 100%
rename from spark/src/main/java/org/apache/iceberg/spark/SparkDataFile.java
rename to spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/SparkDataFile.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/SparkExceptionUtil.java b/spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/SparkExceptionUtil.java
similarity index 100%
rename from spark/src/main/java/org/apache/iceberg/spark/SparkExceptionUtil.java
rename to spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/SparkExceptionUtil.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/SparkFixupTimestampType.java b/spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/SparkFixupTimestampType.java
similarity index 100%
rename from spark/src/main/java/org/apache/iceberg/spark/SparkFixupTimestampType.java
rename to spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/SparkFixupTimestampType.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/SparkFixupTypes.java b/spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/SparkFixupTypes.java
similarity index 100%
rename from spark/src/main/java/org/apache/iceberg/spark/SparkFixupTypes.java
rename to spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/SparkFixupTypes.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/SparkReadConf.java b/spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/SparkReadConf.java
similarity index 100%
rename from spark/src/main/java/org/apache/iceberg/spark/SparkReadConf.java
rename to spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/SparkReadConf.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/SparkReadOptions.java b/spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/SparkReadOptions.java
similarity index 100%
rename from spark/src/main/java/org/apache/iceberg/spark/SparkReadOptions.java
rename to spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/SparkReadOptions.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/SparkSQLProperties.java b/spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/SparkSQLProperties.java
similarity index 100%
rename from spark/src/main/java/org/apache/iceberg/spark/SparkSQLProperties.java
rename to spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/SparkSQLProperties.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/SparkSchemaUtil.java b/spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/SparkSchemaUtil.java
similarity index 100%
rename from spark/src/main/java/org/apache/iceberg/spark/SparkSchemaUtil.java
rename to spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/SparkSchemaUtil.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/SparkStructLike.java b/spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/SparkStructLike.java
similarity index 100%
rename from spark/src/main/java/org/apache/iceberg/spark/SparkStructLike.java
rename to spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/SparkStructLike.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/SparkTableUtil.java b/spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/SparkTableUtil.java
similarity index 99%
rename from spark/src/main/java/org/apache/iceberg/spark/SparkTableUtil.java
rename to spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/SparkTableUtil.java
index 58c8311..7623cb9 100644
--- a/spark/src/main/java/org/apache/iceberg/spark/SparkTableUtil.java
+++ b/spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/SparkTableUtil.java
@@ -521,7 +521,9 @@ public class SparkTableUtil {
             Encoders.javaSerialization(DataFile.class));
 
     if (checkDuplicateFiles) {
-      Dataset<Row> importedFiles = filesToImport.map(f -> f.path().toString(), Encoders.STRING()).toDF("file_path");
+      Dataset<Row> importedFiles = filesToImport
+          .map((MapFunction<DataFile, String>) f -> f.path().toString(), Encoders.STRING())
+          .toDF("file_path");
       Dataset<Row> existingFiles = loadMetadataTable(spark, targetTable, MetadataTableType.ENTRIES);
       Column joinCond = existingFiles.col("data_file.file_path").equalTo(importedFiles.col("file_path"));
       Dataset<String> duplicates = importedFiles.join(existingFiles, joinCond)
diff --git a/spark/src/main/java/org/apache/iceberg/spark/SparkTypeToType.java b/spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/SparkTypeToType.java
similarity index 100%
rename from spark/src/main/java/org/apache/iceberg/spark/SparkTypeToType.java
rename to spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/SparkTypeToType.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/SparkTypeVisitor.java b/spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/SparkTypeVisitor.java
similarity index 100%
rename from spark/src/main/java/org/apache/iceberg/spark/SparkTypeVisitor.java
rename to spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/SparkTypeVisitor.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/SparkUtil.java b/spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/SparkUtil.java
similarity index 100%
rename from spark/src/main/java/org/apache/iceberg/spark/SparkUtil.java
rename to spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/SparkUtil.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/SparkValueConverter.java b/spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/SparkValueConverter.java
similarity index 100%
rename from spark/src/main/java/org/apache/iceberg/spark/SparkValueConverter.java
rename to spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/SparkValueConverter.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/SparkWriteConf.java b/spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/SparkWriteConf.java
similarity index 100%
rename from spark/src/main/java/org/apache/iceberg/spark/SparkWriteConf.java
rename to spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/SparkWriteConf.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/SparkWriteOptions.java b/spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/SparkWriteOptions.java
similarity index 100%
rename from spark/src/main/java/org/apache/iceberg/spark/SparkWriteOptions.java
rename to spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/SparkWriteOptions.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/TypeToSparkType.java b/spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/TypeToSparkType.java
similarity index 100%
rename from spark/src/main/java/org/apache/iceberg/spark/TypeToSparkType.java
rename to spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/TypeToSparkType.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/actions/BaseDeleteOrphanFilesSparkAction.java b/spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/actions/BaseDeleteOrphanFilesSparkAction.java
similarity index 100%
rename from spark/src/main/java/org/apache/iceberg/spark/actions/BaseDeleteOrphanFilesSparkAction.java
rename to spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/actions/BaseDeleteOrphanFilesSparkAction.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/actions/BaseDeleteReachableFilesSparkAction.java b/spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/actions/BaseDeleteReachableFilesSparkAction.java
similarity index 100%
rename from spark/src/main/java/org/apache/iceberg/spark/actions/BaseDeleteReachableFilesSparkAction.java
rename to spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/actions/BaseDeleteReachableFilesSparkAction.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/actions/BaseExpireSnapshotsSparkAction.java b/spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/actions/BaseExpireSnapshotsSparkAction.java
similarity index 100%
rename from spark/src/main/java/org/apache/iceberg/spark/actions/BaseExpireSnapshotsSparkAction.java
rename to spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/actions/BaseExpireSnapshotsSparkAction.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/actions/BaseRewriteDataFilesSparkAction.java b/spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/actions/BaseRewriteDataFilesSparkAction.java
similarity index 100%
rename from spark/src/main/java/org/apache/iceberg/spark/actions/BaseRewriteDataFilesSparkAction.java
rename to spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/actions/BaseRewriteDataFilesSparkAction.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/actions/BaseRewriteManifestsSparkAction.java b/spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/actions/BaseRewriteManifestsSparkAction.java
similarity index 100%
rename from spark/src/main/java/org/apache/iceberg/spark/actions/BaseRewriteManifestsSparkAction.java
rename to spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/actions/BaseRewriteManifestsSparkAction.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/actions/BaseSnapshotUpdateSparkAction.java b/spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/actions/BaseSnapshotUpdateSparkAction.java
similarity index 100%
rename from spark/src/main/java/org/apache/iceberg/spark/actions/BaseSnapshotUpdateSparkAction.java
rename to spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/actions/BaseSnapshotUpdateSparkAction.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/actions/BaseSparkAction.java b/spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/actions/BaseSparkAction.java
similarity index 100%
rename from spark/src/main/java/org/apache/iceberg/spark/actions/BaseSparkAction.java
rename to spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/actions/BaseSparkAction.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/actions/BaseSparkActions.java b/spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/actions/BaseSparkActions.java
similarity index 100%
rename from spark/src/main/java/org/apache/iceberg/spark/actions/BaseSparkActions.java
rename to spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/actions/BaseSparkActions.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/data/AvroWithSparkSchemaVisitor.java b/spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/data/AvroWithSparkSchemaVisitor.java
similarity index 100%
rename from spark/src/main/java/org/apache/iceberg/spark/data/AvroWithSparkSchemaVisitor.java
rename to spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/data/AvroWithSparkSchemaVisitor.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/data/ParquetWithSparkSchemaVisitor.java b/spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/data/ParquetWithSparkSchemaVisitor.java
similarity index 100%
rename from spark/src/main/java/org/apache/iceberg/spark/data/ParquetWithSparkSchemaVisitor.java
rename to spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/data/ParquetWithSparkSchemaVisitor.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/data/SparkAvroReader.java b/spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/data/SparkAvroReader.java
similarity index 100%
rename from spark/src/main/java/org/apache/iceberg/spark/data/SparkAvroReader.java
rename to spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/data/SparkAvroReader.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/data/SparkAvroWriter.java b/spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/data/SparkAvroWriter.java
similarity index 100%
rename from spark/src/main/java/org/apache/iceberg/spark/data/SparkAvroWriter.java
rename to spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/data/SparkAvroWriter.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/data/SparkOrcReader.java b/spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/data/SparkOrcReader.java
similarity index 100%
rename from spark/src/main/java/org/apache/iceberg/spark/data/SparkOrcReader.java
rename to spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/data/SparkOrcReader.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/data/SparkOrcValueReaders.java b/spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/data/SparkOrcValueReaders.java
similarity index 100%
rename from spark/src/main/java/org/apache/iceberg/spark/data/SparkOrcValueReaders.java
rename to spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/data/SparkOrcValueReaders.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/data/SparkOrcValueWriters.java b/spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/data/SparkOrcValueWriters.java
similarity index 100%
rename from spark/src/main/java/org/apache/iceberg/spark/data/SparkOrcValueWriters.java
rename to spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/data/SparkOrcValueWriters.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/data/SparkOrcWriter.java b/spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/data/SparkOrcWriter.java
similarity index 100%
rename from spark/src/main/java/org/apache/iceberg/spark/data/SparkOrcWriter.java
rename to spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/data/SparkOrcWriter.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/data/SparkParquetReaders.java b/spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/data/SparkParquetReaders.java
similarity index 100%
rename from spark/src/main/java/org/apache/iceberg/spark/data/SparkParquetReaders.java
rename to spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/data/SparkParquetReaders.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/data/SparkParquetWriters.java b/spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/data/SparkParquetWriters.java
similarity index 100%
rename from spark/src/main/java/org/apache/iceberg/spark/data/SparkParquetWriters.java
rename to spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/data/SparkParquetWriters.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/data/SparkValueReaders.java b/spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/data/SparkValueReaders.java
similarity index 100%
rename from spark/src/main/java/org/apache/iceberg/spark/data/SparkValueReaders.java
rename to spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/data/SparkValueReaders.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/data/SparkValueWriters.java b/spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/data/SparkValueWriters.java
similarity index 100%
rename from spark/src/main/java/org/apache/iceberg/spark/data/SparkValueWriters.java
rename to spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/data/SparkValueWriters.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/data/vectorized/ArrowVectorAccessorFactory.java b/spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/data/vectorized/ArrowVectorAccessorFactory.java
similarity index 100%
rename from spark/src/main/java/org/apache/iceberg/spark/data/vectorized/ArrowVectorAccessorFactory.java
rename to spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/data/vectorized/ArrowVectorAccessorFactory.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/data/vectorized/ArrowVectorAccessors.java b/spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/data/vectorized/ArrowVectorAccessors.java
similarity index 100%
rename from spark/src/main/java/org/apache/iceberg/spark/data/vectorized/ArrowVectorAccessors.java
rename to spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/data/vectorized/ArrowVectorAccessors.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/data/vectorized/ColumnarBatchReader.java b/spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/data/vectorized/ColumnarBatchReader.java
similarity index 100%
rename from spark/src/main/java/org/apache/iceberg/spark/data/vectorized/ColumnarBatchReader.java
rename to spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/data/vectorized/ColumnarBatchReader.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/data/vectorized/ConstantColumnVector.java b/spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/data/vectorized/ConstantColumnVector.java
similarity index 98%
rename from spark/src/main/java/org/apache/iceberg/spark/data/vectorized/ConstantColumnVector.java
rename to spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/data/vectorized/ConstantColumnVector.java
index 7e3d94a..3cdea65 100644
--- a/spark/src/main/java/org/apache/iceberg/spark/data/vectorized/ConstantColumnVector.java
+++ b/spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/data/vectorized/ConstantColumnVector.java
@@ -118,7 +118,7 @@ class ConstantColumnVector extends ColumnVector {
   }
 
   @Override
-  protected ColumnVector getChild(int ordinal) {
+  public ColumnVector getChild(int ordinal) {
     throw new UnsupportedOperationException("ConstantColumnVector only supports primitives");
   }
 }
diff --git a/spark/src/main/java/org/apache/iceberg/spark/data/vectorized/IcebergArrowColumnVector.java b/spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/data/vectorized/IcebergArrowColumnVector.java
similarity index 100%
rename from spark/src/main/java/org/apache/iceberg/spark/data/vectorized/IcebergArrowColumnVector.java
rename to spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/data/vectorized/IcebergArrowColumnVector.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/data/vectorized/RowPositionColumnVector.java b/spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/data/vectorized/RowPositionColumnVector.java
similarity index 98%
rename from spark/src/main/java/org/apache/iceberg/spark/data/vectorized/RowPositionColumnVector.java
rename to spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/data/vectorized/RowPositionColumnVector.java
index f0d35c6..58db4eb 100644
--- a/spark/src/main/java/org/apache/iceberg/spark/data/vectorized/RowPositionColumnVector.java
+++ b/spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/data/vectorized/RowPositionColumnVector.java
@@ -116,7 +116,7 @@ public class RowPositionColumnVector extends ColumnVector {
   }
 
   @Override
-  protected ColumnVector getChild(int ordinal) {
+  public ColumnVector getChild(int ordinal) {
     throw new UnsupportedOperationException();
   }
 }
diff --git a/spark/src/main/java/org/apache/iceberg/spark/data/vectorized/VectorizedSparkOrcReaders.java b/spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/data/vectorized/VectorizedSparkOrcReaders.java
similarity index 100%
rename from spark/src/main/java/org/apache/iceberg/spark/data/vectorized/VectorizedSparkOrcReaders.java
rename to spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/data/vectorized/VectorizedSparkOrcReaders.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/data/vectorized/VectorizedSparkParquetReaders.java b/spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/data/vectorized/VectorizedSparkParquetReaders.java
similarity index 100%
rename from spark/src/main/java/org/apache/iceberg/spark/data/vectorized/VectorizedSparkParquetReaders.java
rename to spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/data/vectorized/VectorizedSparkParquetReaders.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/source/BaseDataReader.java b/spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/source/BaseDataReader.java
similarity index 100%
rename from spark/src/main/java/org/apache/iceberg/spark/source/BaseDataReader.java
rename to spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/source/BaseDataReader.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/source/BatchDataReader.java b/spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/source/BatchDataReader.java
similarity index 100%
rename from spark/src/main/java/org/apache/iceberg/spark/source/BatchDataReader.java
rename to spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/source/BatchDataReader.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/source/EqualityDeleteRowReader.java b/spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/source/EqualityDeleteRowReader.java
similarity index 100%
rename from spark/src/main/java/org/apache/iceberg/spark/source/EqualityDeleteRowReader.java
rename to spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/source/EqualityDeleteRowReader.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/source/InternalRowWrapper.java b/spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/source/InternalRowWrapper.java
similarity index 100%
rename from spark/src/main/java/org/apache/iceberg/spark/source/InternalRowWrapper.java
rename to spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/source/InternalRowWrapper.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/source/RowDataReader.java b/spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/source/RowDataReader.java
similarity index 100%
rename from spark/src/main/java/org/apache/iceberg/spark/source/RowDataReader.java
rename to spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/source/RowDataReader.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/source/RowDataRewriter.java b/spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/source/RowDataRewriter.java
similarity index 100%
rename from spark/src/main/java/org/apache/iceberg/spark/source/RowDataRewriter.java
rename to spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/source/RowDataRewriter.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/source/SparkAppenderFactory.java b/spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/source/SparkAppenderFactory.java
similarity index 100%
rename from spark/src/main/java/org/apache/iceberg/spark/source/SparkAppenderFactory.java
rename to spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/source/SparkAppenderFactory.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/source/SparkFileWriterFactory.java b/spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/source/SparkFileWriterFactory.java
similarity index 100%
rename from spark/src/main/java/org/apache/iceberg/spark/source/SparkFileWriterFactory.java
rename to spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/source/SparkFileWriterFactory.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/source/SparkPartitionedFanoutWriter.java b/spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/source/SparkPartitionedFanoutWriter.java
similarity index 100%
rename from spark/src/main/java/org/apache/iceberg/spark/source/SparkPartitionedFanoutWriter.java
rename to spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/source/SparkPartitionedFanoutWriter.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/source/SparkPartitionedWriter.java b/spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/source/SparkPartitionedWriter.java
similarity index 100%
rename from spark/src/main/java/org/apache/iceberg/spark/source/SparkPartitionedWriter.java
rename to spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/source/SparkPartitionedWriter.java
diff --git a/spark/src/main/java/org/apache/iceberg/spark/source/StructInternalRow.java b/spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/source/StructInternalRow.java
similarity index 100%
rename from spark/src/main/java/org/apache/iceberg/spark/source/StructInternalRow.java
rename to spark/v3.0/spark3/src/main/java/org/apache/iceberg/spark/source/StructInternalRow.java
diff --git a/spark/src/test/java/org/apache/iceberg/KryoHelpers.java b/spark/v3.0/spark3/src/test/java/org/apache/iceberg/KryoHelpers.java
similarity index 100%
rename from spark/src/test/java/org/apache/iceberg/KryoHelpers.java
rename to spark/v3.0/spark3/src/test/java/org/apache/iceberg/KryoHelpers.java
diff --git a/spark/src/test/java/org/apache/iceberg/TaskCheckHelper.java b/spark/v3.0/spark3/src/test/java/org/apache/iceberg/TaskCheckHelper.java
similarity index 100%
rename from spark/src/test/java/org/apache/iceberg/TaskCheckHelper.java
rename to spark/v3.0/spark3/src/test/java/org/apache/iceberg/TaskCheckHelper.java
diff --git a/spark/src/test/java/org/apache/iceberg/TestDataFileSerialization.java b/spark/v3.0/spark3/src/test/java/org/apache/iceberg/TestDataFileSerialization.java
similarity index 100%
rename from spark/src/test/java/org/apache/iceberg/TestDataFileSerialization.java
rename to spark/v3.0/spark3/src/test/java/org/apache/iceberg/TestDataFileSerialization.java
diff --git a/spark/src/test/java/org/apache/iceberg/TestFileIOSerialization.java b/spark/v3.0/spark3/src/test/java/org/apache/iceberg/TestFileIOSerialization.java
similarity index 100%
rename from spark/src/test/java/org/apache/iceberg/TestFileIOSerialization.java
rename to spark/v3.0/spark3/src/test/java/org/apache/iceberg/TestFileIOSerialization.java
diff --git a/spark/src/test/java/org/apache/iceberg/TestManifestFileSerialization.java b/spark/v3.0/spark3/src/test/java/org/apache/iceberg/TestManifestFileSerialization.java
similarity index 100%
rename from spark/src/test/java/org/apache/iceberg/TestManifestFileSerialization.java
rename to spark/v3.0/spark3/src/test/java/org/apache/iceberg/TestManifestFileSerialization.java
diff --git a/spark/src/test/java/org/apache/iceberg/TestScanTaskSerialization.java b/spark/v3.0/spark3/src/test/java/org/apache/iceberg/TestScanTaskSerialization.java
similarity index 100%
rename from spark/src/test/java/org/apache/iceberg/TestScanTaskSerialization.java
rename to spark/v3.0/spark3/src/test/java/org/apache/iceberg/TestScanTaskSerialization.java
diff --git a/spark/src/test/java/org/apache/iceberg/TestTableSerialization.java b/spark/v3.0/spark3/src/test/java/org/apache/iceberg/TestTableSerialization.java
similarity index 100%
rename from spark/src/test/java/org/apache/iceberg/TestTableSerialization.java
rename to spark/v3.0/spark3/src/test/java/org/apache/iceberg/TestTableSerialization.java
diff --git a/spark/src/test/java/org/apache/iceberg/actions/TestDeleteReachableFilesAction.java b/spark/v3.0/spark3/src/test/java/org/apache/iceberg/actions/TestDeleteReachableFilesAction.java
similarity index 100%
rename from spark/src/test/java/org/apache/iceberg/actions/TestDeleteReachableFilesAction.java
rename to spark/v3.0/spark3/src/test/java/org/apache/iceberg/actions/TestDeleteReachableFilesAction.java
diff --git a/spark/src/test/java/org/apache/iceberg/actions/TestExpireSnapshotsAction.java b/spark/v3.0/spark3/src/test/java/org/apache/iceberg/actions/TestExpireSnapshotsAction.java
similarity index 100%
rename from spark/src/test/java/org/apache/iceberg/actions/TestExpireSnapshotsAction.java
rename to spark/v3.0/spark3/src/test/java/org/apache/iceberg/actions/TestExpireSnapshotsAction.java
diff --git a/spark/src/test/java/org/apache/iceberg/actions/TestRemoveOrphanFilesAction.java b/spark/v3.0/spark3/src/test/java/org/apache/iceberg/actions/TestRemoveOrphanFilesAction.java
similarity index 100%
rename from spark/src/test/java/org/apache/iceberg/actions/TestRemoveOrphanFilesAction.java
rename to spark/v3.0/spark3/src/test/java/org/apache/iceberg/actions/TestRemoveOrphanFilesAction.java
diff --git a/spark/src/test/java/org/apache/iceberg/actions/TestRewriteDataFilesAction.java b/spark/v3.0/spark3/src/test/java/org/apache/iceberg/actions/TestRewriteDataFilesAction.java
similarity index 100%
rename from spark/src/test/java/org/apache/iceberg/actions/TestRewriteDataFilesAction.java
rename to spark/v3.0/spark3/src/test/java/org/apache/iceberg/actions/TestRewriteDataFilesAction.java
diff --git a/spark/src/test/java/org/apache/iceberg/actions/TestRewriteManifestsAction.java b/spark/v3.0/spark3/src/test/java/org/apache/iceberg/actions/TestRewriteManifestsAction.java
similarity index 100%
rename from spark/src/test/java/org/apache/iceberg/actions/TestRewriteManifestsAction.java
rename to spark/v3.0/spark3/src/test/java/org/apache/iceberg/actions/TestRewriteManifestsAction.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/SparkTestBase.java b/spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/SparkTestBase.java
similarity index 100%
rename from spark/src/test/java/org/apache/iceberg/spark/SparkTestBase.java
rename to spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/SparkTestBase.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/TestSparkSchemaUtil.java b/spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/TestSparkSchemaUtil.java
similarity index 100%
rename from spark/src/test/java/org/apache/iceberg/spark/TestSparkSchemaUtil.java
rename to spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/TestSparkSchemaUtil.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/actions/TestNewRewriteDataFilesAction.java b/spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/actions/TestNewRewriteDataFilesAction.java
similarity index 100%
rename from spark/src/test/java/org/apache/iceberg/spark/actions/TestNewRewriteDataFilesAction.java
rename to spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/actions/TestNewRewriteDataFilesAction.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/data/AvroDataTest.java b/spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/data/AvroDataTest.java
similarity index 100%
rename from spark/src/test/java/org/apache/iceberg/spark/data/AvroDataTest.java
rename to spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/data/AvroDataTest.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/data/GenericsHelpers.java b/spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/data/GenericsHelpers.java
similarity index 100%
rename from spark/src/test/java/org/apache/iceberg/spark/data/GenericsHelpers.java
rename to spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/data/GenericsHelpers.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/data/RandomData.java b/spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/data/RandomData.java
similarity index 100%
rename from spark/src/test/java/org/apache/iceberg/spark/data/RandomData.java
rename to spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/data/RandomData.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/data/TestHelpers.java b/spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/data/TestHelpers.java
similarity index 100%
rename from spark/src/test/java/org/apache/iceberg/spark/data/TestHelpers.java
rename to spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/data/TestHelpers.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/data/TestOrcWrite.java b/spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/data/TestOrcWrite.java
similarity index 100%
rename from spark/src/test/java/org/apache/iceberg/spark/data/TestOrcWrite.java
rename to spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/data/TestOrcWrite.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/data/TestParquetAvroReader.java b/spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/data/TestParquetAvroReader.java
similarity index 100%
rename from spark/src/test/java/org/apache/iceberg/spark/data/TestParquetAvroReader.java
rename to spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/data/TestParquetAvroReader.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/data/TestParquetAvroWriter.java b/spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/data/TestParquetAvroWriter.java
similarity index 100%
rename from spark/src/test/java/org/apache/iceberg/spark/data/TestParquetAvroWriter.java
rename to spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/data/TestParquetAvroWriter.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/data/TestSparkAvroEnums.java b/spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/data/TestSparkAvroEnums.java
similarity index 100%
rename from spark/src/test/java/org/apache/iceberg/spark/data/TestSparkAvroEnums.java
rename to spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/data/TestSparkAvroEnums.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/data/TestSparkAvroReader.java b/spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/data/TestSparkAvroReader.java
similarity index 100%
rename from spark/src/test/java/org/apache/iceberg/spark/data/TestSparkAvroReader.java
rename to spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/data/TestSparkAvroReader.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/data/TestSparkDateTimes.java b/spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/data/TestSparkDateTimes.java
similarity index 90%
rename from spark/src/test/java/org/apache/iceberg/spark/data/TestSparkDateTimes.java
rename to spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/data/TestSparkDateTimes.java
index 10da4da..fb4538a 100644
--- a/spark/src/test/java/org/apache/iceberg/spark/data/TestSparkDateTimes.java
+++ b/spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/data/TestSparkDateTimes.java
@@ -19,10 +19,12 @@
 
 package org.apache.iceberg.spark.data;
 
+import java.time.ZoneId;
 import java.util.TimeZone;
 import org.apache.iceberg.expressions.Literal;
 import org.apache.iceberg.types.Types;
 import org.apache.spark.sql.catalyst.util.DateTimeUtils;
+import org.apache.spark.sql.catalyst.util.TimestampFormatter;
 import org.junit.Assert;
 import org.junit.Test;
 
@@ -65,7 +67,9 @@ public class TestSparkDateTimes {
 
   public void checkSparkTimestamp(String timestampString, String sparkRepr) {
     Literal<Long> ts = Literal.of(timestampString).to(Types.TimestampType.withZone());
-    String sparkTimestamp = DateTimeUtils.timestampToString(ts.value());
+    ZoneId zoneId = DateTimeUtils.getZoneId("UTC");
+    TimestampFormatter formatter = TimestampFormatter.getFractionFormatter(zoneId);
+    String sparkTimestamp = DateTimeUtils.timestampToString(formatter, ts.value());
     System.err.println(timestampString + ": " + ts.value());
     Assert.assertEquals("Should be the same timestamp (" + ts.value() + ")",
         sparkRepr, sparkTimestamp);
diff --git a/spark/src/test/java/org/apache/iceberg/spark/data/TestSparkOrcReadMetadataColumns.java b/spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/data/TestSparkOrcReadMetadataColumns.java
similarity index 100%
rename from spark/src/test/java/org/apache/iceberg/spark/data/TestSparkOrcReadMetadataColumns.java
rename to spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/data/TestSparkOrcReadMetadataColumns.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/data/TestSparkOrcReader.java b/spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/data/TestSparkOrcReader.java
similarity index 100%
rename from spark/src/test/java/org/apache/iceberg/spark/data/TestSparkOrcReader.java
rename to spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/data/TestSparkOrcReader.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/data/TestSparkParquetReadMetadataColumns.java b/spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/data/TestSparkParquetReadMetadataColumns.java
similarity index 100%
rename from spark/src/test/java/org/apache/iceberg/spark/data/TestSparkParquetReadMetadataColumns.java
rename to spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/data/TestSparkParquetReadMetadataColumns.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/data/TestSparkParquetReader.java b/spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/data/TestSparkParquetReader.java
similarity index 100%
rename from spark/src/test/java/org/apache/iceberg/spark/data/TestSparkParquetReader.java
rename to spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/data/TestSparkParquetReader.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/data/TestSparkParquetWriter.java b/spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/data/TestSparkParquetWriter.java
similarity index 100%
rename from spark/src/test/java/org/apache/iceberg/spark/data/TestSparkParquetWriter.java
rename to spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/data/TestSparkParquetWriter.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/data/TestSparkRecordOrcReaderWriter.java b/spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/data/TestSparkRecordOrcReaderWriter.java
similarity index 100%
rename from spark/src/test/java/org/apache/iceberg/spark/data/TestSparkRecordOrcReaderWriter.java
rename to spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/data/TestSparkRecordOrcReaderWriter.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/data/parquet/vectorized/TestParquetDictionaryEncodedVectorizedReads.java b/spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/data/parquet/vectorized/TestParquetDictionaryEncodedVectorizedReads.java
similarity index 100%
rename from spark/src/test/java/org/apache/iceberg/spark/data/parquet/vectorized/TestParquetDictionaryEncodedVectorizedReads.java
rename to spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/data/parquet/vectorized/TestParquetDictionaryEncodedVectorizedReads.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/data/parquet/vectorized/TestParquetDictionaryFallbackToPlainEncodingVectorizedReads.java b/spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/data/parquet/vectorized/TestParquetDictionaryFallbackToPlainEncodingVectorizedReads.java
similarity index 100%
rename from spark/src/test/java/org/apache/iceberg/spark/data/parquet/vectorized/TestParquetDictionaryFallbackToPlainEncodingVectorizedReads.java
rename to spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/data/parquet/vectorized/TestParquetDictionaryFallbackToPlainEncodingVectorizedReads.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/data/parquet/vectorized/TestParquetVectorizedReads.java b/spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/data/parquet/vectorized/TestParquetVectorizedReads.java
similarity index 100%
rename from spark/src/test/java/org/apache/iceberg/spark/data/parquet/vectorized/TestParquetVectorizedReads.java
rename to spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/data/parquet/vectorized/TestParquetVectorizedReads.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/source/LogMessage.java b/spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/source/LogMessage.java
similarity index 100%
rename from spark/src/test/java/org/apache/iceberg/spark/source/LogMessage.java
rename to spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/source/LogMessage.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/source/SimpleRecord.java b/spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/source/SimpleRecord.java
similarity index 100%
rename from spark/src/test/java/org/apache/iceberg/spark/source/SimpleRecord.java
rename to spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/source/SimpleRecord.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/source/TestAvroScan.java b/spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/source/TestAvroScan.java
similarity index 100%
rename from spark/src/test/java/org/apache/iceberg/spark/source/TestAvroScan.java
rename to spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/source/TestAvroScan.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/source/TestDataFrameWrites.java b/spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/source/TestDataFrameWrites.java
similarity index 100%
rename from spark/src/test/java/org/apache/iceberg/spark/source/TestDataFrameWrites.java
rename to spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/source/TestDataFrameWrites.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/source/TestDataSourceOptions.java b/spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/source/TestDataSourceOptions.java
similarity index 100%
rename from spark/src/test/java/org/apache/iceberg/spark/source/TestDataSourceOptions.java
rename to spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/source/TestDataSourceOptions.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/source/TestForwardCompatibility.java b/spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/source/TestForwardCompatibility.java
similarity index 98%
rename from spark/src/test/java/org/apache/iceberg/spark/source/TestForwardCompatibility.java
rename to spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/source/TestForwardCompatibility.java
index 2c7af66..6ee7ee9 100644
--- a/spark/src/test/java/org/apache/iceberg/spark/source/TestForwardCompatibility.java
+++ b/spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/source/TestForwardCompatibility.java
@@ -23,6 +23,7 @@ import java.io.File;
 import java.io.IOException;
 import java.util.List;
 import java.util.UUID;
+import java.util.concurrent.TimeoutException;
 import org.apache.avro.generic.GenericData;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.iceberg.AssertHelpers;
@@ -125,7 +126,7 @@ public abstract class TestForwardCompatibility {
   }
 
   @Test
-  public void testSparkStreamingWriteFailsUnknownTransform() throws IOException {
+  public void testSparkStreamingWriteFailsUnknownTransform() throws IOException, TimeoutException {
     File parent = temp.newFolder("avro");
     File location = new File(parent, "test");
     File dataFolder = new File(location, "data");
diff --git a/spark/src/test/java/org/apache/iceberg/spark/source/TestIcebergSourceHadoopTables.java b/spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/source/TestIcebergSourceHadoopTables.java
similarity index 100%
rename from spark/src/test/java/org/apache/iceberg/spark/source/TestIcebergSourceHadoopTables.java
rename to spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/source/TestIcebergSourceHadoopTables.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/source/TestIcebergSourceHiveTables.java b/spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/source/TestIcebergSourceHiveTables.java
similarity index 100%
rename from spark/src/test/java/org/apache/iceberg/spark/source/TestIcebergSourceHiveTables.java
rename to spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/source/TestIcebergSourceHiveTables.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/source/TestIcebergSourceTablesBase.java b/spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/source/TestIcebergSourceTablesBase.java
similarity index 100%
rename from spark/src/test/java/org/apache/iceberg/spark/source/TestIcebergSourceTablesBase.java
rename to spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/source/TestIcebergSourceTablesBase.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/source/TestIcebergSpark.java b/spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/source/TestIcebergSpark.java
similarity index 100%
rename from spark/src/test/java/org/apache/iceberg/spark/source/TestIcebergSpark.java
rename to spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/source/TestIcebergSpark.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/source/TestIdentityPartitionData.java b/spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/source/TestIdentityPartitionData.java
similarity index 100%
rename from spark/src/test/java/org/apache/iceberg/spark/source/TestIdentityPartitionData.java
rename to spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/source/TestIdentityPartitionData.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/source/TestInternalRowWrapper.java b/spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/source/TestInternalRowWrapper.java
similarity index 100%
rename from spark/src/test/java/org/apache/iceberg/spark/source/TestInternalRowWrapper.java
rename to spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/source/TestInternalRowWrapper.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/source/TestParquetScan.java b/spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/source/TestParquetScan.java
similarity index 100%
rename from spark/src/test/java/org/apache/iceberg/spark/source/TestParquetScan.java
rename to spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/source/TestParquetScan.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/source/TestPartitionPruning.java b/spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/source/TestPartitionPruning.java
similarity index 100%
rename from spark/src/test/java/org/apache/iceberg/spark/source/TestPartitionPruning.java
rename to spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/source/TestPartitionPruning.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/source/TestPartitionValues.java b/spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/source/TestPartitionValues.java
similarity index 100%
rename from spark/src/test/java/org/apache/iceberg/spark/source/TestPartitionValues.java
rename to spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/source/TestPartitionValues.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/source/TestReadProjection.java b/spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/source/TestReadProjection.java
similarity index 100%
rename from spark/src/test/java/org/apache/iceberg/spark/source/TestReadProjection.java
rename to spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/source/TestReadProjection.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/source/TestSnapshotSelection.java b/spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/source/TestSnapshotSelection.java
similarity index 100%
rename from spark/src/test/java/org/apache/iceberg/spark/source/TestSnapshotSelection.java
rename to spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/source/TestSnapshotSelection.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/source/TestSparkAppenderFactory.java b/spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/source/TestSparkAppenderFactory.java
similarity index 100%
rename from spark/src/test/java/org/apache/iceberg/spark/source/TestSparkAppenderFactory.java
rename to spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/source/TestSparkAppenderFactory.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/source/TestSparkBaseDataReader.java b/spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/source/TestSparkBaseDataReader.java
similarity index 100%
rename from spark/src/test/java/org/apache/iceberg/spark/source/TestSparkBaseDataReader.java
rename to spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/source/TestSparkBaseDataReader.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/source/TestSparkDataFile.java b/spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/source/TestSparkDataFile.java
similarity index 100%
rename from spark/src/test/java/org/apache/iceberg/spark/source/TestSparkDataFile.java
rename to spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/source/TestSparkDataFile.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/source/TestSparkDataWrite.java b/spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/source/TestSparkDataWrite.java
similarity index 100%
rename from spark/src/test/java/org/apache/iceberg/spark/source/TestSparkDataWrite.java
rename to spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/source/TestSparkDataWrite.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/source/TestSparkFileWriterFactory.java b/spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/source/TestSparkFileWriterFactory.java
similarity index 100%
rename from spark/src/test/java/org/apache/iceberg/spark/source/TestSparkFileWriterFactory.java
rename to spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/source/TestSparkFileWriterFactory.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/source/TestSparkMergingMetrics.java b/spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/source/TestSparkMergingMetrics.java
similarity index 100%
rename from spark/src/test/java/org/apache/iceberg/spark/source/TestSparkMergingMetrics.java
rename to spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/source/TestSparkMergingMetrics.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/source/TestSparkPartitioningWriters.java b/spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/source/TestSparkPartitioningWriters.java
similarity index 100%
rename from spark/src/test/java/org/apache/iceberg/spark/source/TestSparkPartitioningWriters.java
rename to spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/source/TestSparkPartitioningWriters.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/source/TestSparkPositionDeltaWriters.java b/spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/source/TestSparkPositionDeltaWriters.java
similarity index 100%
rename from spark/src/test/java/org/apache/iceberg/spark/source/TestSparkPositionDeltaWriters.java
rename to spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/source/TestSparkPositionDeltaWriters.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/source/TestSparkReadProjection.java b/spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/source/TestSparkReadProjection.java
similarity index 100%
rename from spark/src/test/java/org/apache/iceberg/spark/source/TestSparkReadProjection.java
rename to spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/source/TestSparkReadProjection.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/source/TestSparkReaderDeletes.java b/spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/source/TestSparkReaderDeletes.java
similarity index 100%
rename from spark/src/test/java/org/apache/iceberg/spark/source/TestSparkReaderDeletes.java
rename to spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/source/TestSparkReaderDeletes.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/source/TestSparkRollingFileWriters.java b/spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/source/TestSparkRollingFileWriters.java
similarity index 100%
rename from spark/src/test/java/org/apache/iceberg/spark/source/TestSparkRollingFileWriters.java
rename to spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/source/TestSparkRollingFileWriters.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/source/TestSparkSchema.java b/spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/source/TestSparkSchema.java
similarity index 100%
rename from spark/src/test/java/org/apache/iceberg/spark/source/TestSparkSchema.java
rename to spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/source/TestSparkSchema.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/source/TestSparkWriterMetrics.java b/spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/source/TestSparkWriterMetrics.java
similarity index 100%
rename from spark/src/test/java/org/apache/iceberg/spark/source/TestSparkWriterMetrics.java
rename to spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/source/TestSparkWriterMetrics.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/source/TestStructuredStreaming.java b/spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/source/TestStructuredStreaming.java
similarity index 100%
rename from spark/src/test/java/org/apache/iceberg/spark/source/TestStructuredStreaming.java
rename to spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/source/TestStructuredStreaming.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/source/TestTables.java b/spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/source/TestTables.java
similarity index 100%
rename from spark/src/test/java/org/apache/iceberg/spark/source/TestTables.java
rename to spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/source/TestTables.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/source/TestTimestampWithoutZone.java b/spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/source/TestTimestampWithoutZone.java
similarity index 100%
rename from spark/src/test/java/org/apache/iceberg/spark/source/TestTimestampWithoutZone.java
rename to spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/source/TestTimestampWithoutZone.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/source/TestWriteMetricsConfig.java b/spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/source/TestWriteMetricsConfig.java
similarity index 100%
rename from spark/src/test/java/org/apache/iceberg/spark/source/TestWriteMetricsConfig.java
rename to spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/source/TestWriteMetricsConfig.java
diff --git a/spark/src/test/java/org/apache/iceberg/spark/source/ThreeColumnRecord.java b/spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/source/ThreeColumnRecord.java
similarity index 100%
rename from spark/src/test/java/org/apache/iceberg/spark/source/ThreeColumnRecord.java
rename to spark/v3.0/spark3/src/test/java/org/apache/iceberg/spark/source/ThreeColumnRecord.java