This is an automated email from the ASF dual-hosted git repository. biyan pushed a commit to branch release-0.6 in repository https://gitbox.apache.org/repos/asf/incubator-paimon.git
commit 5c04b45a8a28ff392faf31b34246a5e107dfae46 Author: Yann Byron <[email protected]> AuthorDate: Tue Jan 2 16:17:12 2024 +0800 [spark] Supports CTAS for different versions (#2591) --- paimon-spark/paimon-spark-3.2/pom.xml | 59 ++++++++++++++++++ .../shim/PaimonCreateTableAsSelectStrategy.scala | 57 +++++++++++++++++ .../org/apache/paimon/spark/sql/DDLTest.scala | 20 ++++++ paimon-spark/paimon-spark-3.3/pom.xml | 7 +++ .../org/apache/paimon/spark/sql/DDLTest.scala | 41 +------------ paimon-spark/paimon-spark-3.4/pom.xml | 41 +++++++------ .../shim/PaimonCreateTableAsSelectStrategy.scala | 71 ++++++++++++++++++++++ .../org/apache/paimon/spark/sql/DDLTest.scala | 20 ++++++ .../org/apache/paimon/spark/sql/DDLTest.scala | 20 ++++++ paimon-spark/paimon-spark-common/pom.xml | 14 +++++ .../org/apache/paimon/spark/sql/DDLTest.scala | 59 ------------------ .../org/apache/paimon/spark/sql/DDLTestBase.scala | 61 +++++++++++++++++++ 12 files changed, 353 insertions(+), 117 deletions(-) diff --git a/paimon-spark/paimon-spark-3.2/pom.xml b/paimon-spark/paimon-spark-3.2/pom.xml index 3af4ca84b..332ce4ae2 100644 --- a/paimon-spark/paimon-spark-3.2/pom.xml +++ b/paimon-spark/paimon-spark-3.2/pom.xml @@ -76,9 +76,24 @@ under the License. <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j2-impl</artifactId> </exclusion> + <exclusion> + <groupId>org.apache.orc</groupId> + <artifactId>orc-core</artifactId> + </exclusion> + <exclusion> + <groupId>org.apache.orc</groupId> + <artifactId>orc-mapreduce</artifactId> + </exclusion> </exclusions> </dependency> + <dependency> + <groupId>org.apache.paimon</groupId> + <artifactId>paimon-spark-common</artifactId> + <version>${project.version}</version> + <type>test-jar</type> + <scope>test</scope> + </dependency> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-sql_2.12</artifactId> @@ -156,6 +171,26 @@ under the License. </dependencies> <build> + <pluginManagement> + <plugins> + <plugin> + <groupId>net.alchim31.maven</groupId> + <artifactId>scala-maven-plugin</artifactId> + <version>${scala-maven-plugin.version}</version> + <configuration> + <args> + <arg>-nobootcp</arg> + <arg>-target:jvm-${target.java.version}</arg> + </args> + <checkMultipleScalaVersions>false</checkMultipleScalaVersions> + </configuration> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-compiler-plugin</artifactId> + </plugin> + </plugins> + </pluginManagement> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> @@ -222,6 +257,30 @@ under the License. </scala> </configuration> </plugin> + <plugin> + <groupId>org.scalatest</groupId> + <artifactId>scalatest-maven-plugin</artifactId> + <version>${scalatest-maven-plugin.version}</version> + <configuration> + <reportsDirectory>${project.build.directory}/surefire-reports</reportsDirectory> + <junitxml>.</junitxml> + <argLine>-ea -Xmx4g -Xss4m -XX:MaxMetaspaceSize=2g -XX:ReservedCodeCacheSize=${CodeCacheSize} ${extraJavaTestArgs} -Dio.netty.tryReflectionSetAccessible=true</argLine> + <filereports>PaimonTestSuite.txt</filereports> + <!-- + the plugin does not support always now, we must be careful w/ singletons. + tracking at: https://github.com/scalatest/scalatest-maven-plugin/issues/99 + --> + <forkMode>once</forkMode> + </configuration> + <executions> + <execution> + <id>test</id> + <goals> + <goal>test</goal> + </goals> + </execution> + </executions> + </plugin> </plugins> </build> </project> diff --git a/paimon-spark/paimon-spark-3.2/src/main/scala/org/apache/spark/sql/execution/shim/PaimonCreateTableAsSelectStrategy.scala b/paimon-spark/paimon-spark-3.2/src/main/scala/org/apache/spark/sql/execution/shim/PaimonCreateTableAsSelectStrategy.scala new file mode 100644 index 000000000..299d07f20 --- /dev/null +++ b/paimon-spark/paimon-spark-3.2/src/main/scala/org/apache/spark/sql/execution/shim/PaimonCreateTableAsSelectStrategy.scala @@ -0,0 +1,57 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.spark.sql.execution.shim + +import org.apache.paimon.CoreOptions + +import org.apache.spark.sql.{SparkSession, Strategy} +import org.apache.spark.sql.catalyst.plans.logical.{CreateTableAsSelect, LogicalPlan} +import org.apache.spark.sql.connector.catalog.{CatalogV2Util, StagingTableCatalog} +import org.apache.spark.sql.execution.SparkPlan +import org.apache.spark.sql.execution.datasources.v2.CreateTableAsSelectExec +import org.apache.spark.sql.util.CaseInsensitiveStringMap + +import scala.collection.JavaConverters._ + +case class PaimonCreateTableAsSelectStrategy(spark: SparkSession) extends Strategy { + + override def apply(plan: LogicalPlan): Seq[SparkPlan] = plan match { + case CreateTableAsSelect(catalog, ident, parts, query, props, options, ifNotExists) => + catalog match { + case _: StagingTableCatalog => + throw new RuntimeException("Paimon can't extend StagingTableCatalog for now.") + case _ => + val coreOptionKeys = CoreOptions.getOptions.asScala.map(_.key()).toSeq + val (coreOptions, writeOptions) = options.partition { + case (key, _) => coreOptionKeys.contains(key) + } + val newProps = CatalogV2Util.withDefaultOwnership(props) ++ coreOptions + CreateTableAsSelectExec( + catalog, + ident, + parts, + query, + planLater(query), + newProps, + new CaseInsensitiveStringMap(writeOptions.asJava), + ifNotExists + ) :: Nil + } + case _ => Nil + } +} diff --git a/paimon-spark/paimon-spark-3.2/src/test/scala/org/apache/paimon/spark/sql/DDLTest.scala b/paimon-spark/paimon-spark-3.2/src/test/scala/org/apache/paimon/spark/sql/DDLTest.scala new file mode 100644 index 000000000..8756c5b57 --- /dev/null +++ b/paimon-spark/paimon-spark-3.2/src/test/scala/org/apache/paimon/spark/sql/DDLTest.scala @@ -0,0 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.paimon.spark.sql + +class DDLTest extends DDLTestBase {} diff --git a/paimon-spark/paimon-spark-3.3/pom.xml b/paimon-spark/paimon-spark-3.3/pom.xml index 75a2d0f91..6191495af 100644 --- a/paimon-spark/paimon-spark-3.3/pom.xml +++ b/paimon-spark/paimon-spark-3.3/pom.xml @@ -79,6 +79,13 @@ under the License. </exclusions> </dependency> + <dependency> + <groupId>org.apache.paimon</groupId> + <artifactId>paimon-spark-common</artifactId> + <version>${project.version}</version> + <classifier>tests</classifier> + <scope>test</scope> + </dependency> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-sql_2.12</artifactId> diff --git a/paimon-spark/paimon-spark-3.3/src/test/scala/org/apache/paimon/spark/sql/DDLTest.scala b/paimon-spark/paimon-spark-3.3/src/test/scala/org/apache/paimon/spark/sql/DDLTest.scala index 7187db29d..8756c5b57 100644 --- a/paimon-spark/paimon-spark-3.3/src/test/scala/org/apache/paimon/spark/sql/DDLTest.scala +++ b/paimon-spark/paimon-spark-3.3/src/test/scala/org/apache/paimon/spark/sql/DDLTest.scala @@ -17,43 +17,4 @@ */ package org.apache.paimon.spark.sql -import org.apache.paimon.spark.PaimonSparkTestBase - -import org.junit.jupiter.api.Assertions - -class DDLTest extends PaimonSparkTestBase { - - import testImplicits._ - - test("Paimon: Create Table As Select") { - Seq((1L, "x1", "2023"), (2L, "x2", "2023")) - .toDF("a", "b", "pt") - .createOrReplaceTempView("source") - - spark.sql(""" - |CREATE TABLE t1 AS SELECT * FROM source - |""".stripMargin) - val t1 = loadTable("t1") - Assertions.assertTrue(t1.primaryKeys().isEmpty) - Assertions.assertTrue(t1.partitionKeys().isEmpty) - - spark.sql( - """ - |CREATE TABLE t2 - |PARTITIONED BY (pt) - |TBLPROPERTIES ('bucket' = '5', 'primary-key' = 'a,pt', 'target-file-size' = '128MB') - |AS SELECT * FROM source - |""".stripMargin) - val t2 = loadTable("t2") - Assertions.assertEquals(2, t2.primaryKeys().size()) - Assertions.assertTrue(t2.primaryKeys().contains("a")) - Assertions.assertTrue(t2.primaryKeys().contains("pt")) - Assertions.assertEquals(1, t2.partitionKeys().size()) - Assertions.assertEquals("pt", t2.partitionKeys().get(0)) - - // check all the core options - Assertions.assertEquals("5", t2.options().get("bucket")) - Assertions.assertEquals("128MB", t2.options().get("target-file-size")) - } - -} +class DDLTest extends DDLTestBase {} diff --git a/paimon-spark/paimon-spark-3.4/pom.xml b/paimon-spark/paimon-spark-3.4/pom.xml index c2932c418..9ba83157f 100644 --- a/paimon-spark/paimon-spark-3.4/pom.xml +++ b/paimon-spark/paimon-spark-3.4/pom.xml @@ -42,6 +42,22 @@ under the License. <version>${project.version}</version> </dependency> + <dependency> + <groupId>org.scala-lang</groupId> + <artifactId>scala-library</artifactId> + <version>${scala.version}</version> + </dependency> + <dependency> + <groupId>org.scala-lang</groupId> + <artifactId>scala-reflect</artifactId> + <version>${scala.version}</version> + </dependency> + <dependency> + <groupId>org.scala-lang</groupId> + <artifactId>scala-compiler</artifactId> + <version>${scala.version}</version> + </dependency> + <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-sql_2.12</artifactId> @@ -63,6 +79,13 @@ under the License. </exclusions> </dependency> + <dependency> + <groupId>org.apache.paimon</groupId> + <artifactId>paimon-spark-common</artifactId> + <version>${project.version}</version> + <classifier>tests</classifier> + <scope>test</scope> + </dependency> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-sql_2.12</artifactId> @@ -130,24 +153,6 @@ under the License. </exclusion> </exclusions> </dependency> - <dependency> - <groupId>org.scala-lang</groupId> - <artifactId>scala-library</artifactId> - <version>${scala.version}</version> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.scala-lang</groupId> - <artifactId>scala-reflect</artifactId> - <version>${scala.version}</version> - <scope>test</scope> - </dependency> - <dependency> - <groupId>org.scala-lang</groupId> - <artifactId>scala-compiler</artifactId> - <version>${scala.version}</version> - <scope>test</scope> - </dependency> <dependency> <groupId>org.scalatest</groupId> <artifactId>scalatest_${scala.binary.version}</artifactId> diff --git a/paimon-spark/paimon-spark-3.4/src/main/scala/org/apache/spark/sql/execution/shim/PaimonCreateTableAsSelectStrategy.scala b/paimon-spark/paimon-spark-3.4/src/main/scala/org/apache/spark/sql/execution/shim/PaimonCreateTableAsSelectStrategy.scala new file mode 100644 index 000000000..e631bbea6 --- /dev/null +++ b/paimon-spark/paimon-spark-3.4/src/main/scala/org/apache/spark/sql/execution/shim/PaimonCreateTableAsSelectStrategy.scala @@ -0,0 +1,71 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.spark.sql.execution.shim + +import org.apache.paimon.CoreOptions +import org.apache.paimon.spark.SparkCatalog + +import org.apache.spark.sql.{SparkSession, Strategy} +import org.apache.spark.sql.catalyst.analysis.ResolvedIdentifier +import org.apache.spark.sql.catalyst.plans.logical.{CreateTableAsSelect, LogicalPlan, TableSpec} +import org.apache.spark.sql.connector.catalog.StagingTableCatalog +import org.apache.spark.sql.execution.{PaimonStrategyHelper, SparkPlan} +import org.apache.spark.sql.execution.datasources.v2.CreateTableAsSelectExec +import org.apache.spark.sql.util.CaseInsensitiveStringMap + +import scala.collection.JavaConverters._ + +case class PaimonCreateTableAsSelectStrategy(spark: SparkSession) + extends Strategy + with PaimonStrategyHelper { + + import org.apache.spark.sql.connector.catalog.CatalogV2Implicits._ + + override def apply(plan: LogicalPlan): Seq[SparkPlan] = plan match { + case CreateTableAsSelect( + ResolvedIdentifier(catalog: SparkCatalog, ident), + parts, + query, + tableSpec: TableSpec, + options, + ifNotExists, + analyzedQuery) => + assert(analyzedQuery.isDefined) + catalog match { + case _: StagingTableCatalog => + throw new RuntimeException("Paimon can't extend StagingTableCatalog for now.") + case _ => + val coreOptionKeys = CoreOptions.getOptions.asScala.map(_.key()).toSeq + val (coreOptions, writeOptions) = options.partition { + case (key, _) => coreOptionKeys.contains(key) + } + val newTableSpec = tableSpec.copy(properties = tableSpec.properties ++ coreOptions) + CreateTableAsSelectExec( + catalog.asTableCatalog, + ident, + parts, + analyzedQuery.get, + planLater(query), + qualifyLocInTableSpec(newTableSpec), + new CaseInsensitiveStringMap(writeOptions.asJava), + ifNotExists + ) :: Nil + } + case _ => Nil + } +} diff --git a/paimon-spark/paimon-spark-3.4/src/test/scala/org/apache/paimon/spark/sql/DDLTest.scala b/paimon-spark/paimon-spark-3.4/src/test/scala/org/apache/paimon/spark/sql/DDLTest.scala new file mode 100644 index 000000000..8756c5b57 --- /dev/null +++ b/paimon-spark/paimon-spark-3.4/src/test/scala/org/apache/paimon/spark/sql/DDLTest.scala @@ -0,0 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.paimon.spark.sql + +class DDLTest extends DDLTestBase {} diff --git a/paimon-spark/paimon-spark-3.5/src/test/scala/org/apache/paimon/spark/sql/DDLTest.scala b/paimon-spark/paimon-spark-3.5/src/test/scala/org/apache/paimon/spark/sql/DDLTest.scala new file mode 100644 index 000000000..8756c5b57 --- /dev/null +++ b/paimon-spark/paimon-spark-3.5/src/test/scala/org/apache/paimon/spark/sql/DDLTest.scala @@ -0,0 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.paimon.spark.sql + +class DDLTest extends DDLTestBase {} diff --git a/paimon-spark/paimon-spark-common/pom.xml b/paimon-spark/paimon-spark-common/pom.xml index c7e6b9343..d3f23a71e 100644 --- a/paimon-spark/paimon-spark-common/pom.xml +++ b/paimon-spark/paimon-spark-common/pom.xml @@ -235,7 +235,21 @@ under the License. </plugin> </plugins> </pluginManagement> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-jar-plugin</artifactId> + <executions> + <execution> + <id>prepare-test-jar</id> + <phase>test-compile</phase> + <goals> + <goal>test-jar</goal> + </goals> + </execution> + </executions> + </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> diff --git a/paimon-spark/paimon-spark-common/src/test/scala/org/apache/paimon/spark/sql/DDLTest.scala b/paimon-spark/paimon-spark-common/src/test/scala/org/apache/paimon/spark/sql/DDLTest.scala deleted file mode 100644 index 7187db29d..000000000 --- a/paimon-spark/paimon-spark-common/src/test/scala/org/apache/paimon/spark/sql/DDLTest.scala +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.paimon.spark.sql - -import org.apache.paimon.spark.PaimonSparkTestBase - -import org.junit.jupiter.api.Assertions - -class DDLTest extends PaimonSparkTestBase { - - import testImplicits._ - - test("Paimon: Create Table As Select") { - Seq((1L, "x1", "2023"), (2L, "x2", "2023")) - .toDF("a", "b", "pt") - .createOrReplaceTempView("source") - - spark.sql(""" - |CREATE TABLE t1 AS SELECT * FROM source - |""".stripMargin) - val t1 = loadTable("t1") - Assertions.assertTrue(t1.primaryKeys().isEmpty) - Assertions.assertTrue(t1.partitionKeys().isEmpty) - - spark.sql( - """ - |CREATE TABLE t2 - |PARTITIONED BY (pt) - |TBLPROPERTIES ('bucket' = '5', 'primary-key' = 'a,pt', 'target-file-size' = '128MB') - |AS SELECT * FROM source - |""".stripMargin) - val t2 = loadTable("t2") - Assertions.assertEquals(2, t2.primaryKeys().size()) - Assertions.assertTrue(t2.primaryKeys().contains("a")) - Assertions.assertTrue(t2.primaryKeys().contains("pt")) - Assertions.assertEquals(1, t2.partitionKeys().size()) - Assertions.assertEquals("pt", t2.partitionKeys().get(0)) - - // check all the core options - Assertions.assertEquals("5", t2.options().get("bucket")) - Assertions.assertEquals("128MB", t2.options().get("target-file-size")) - } - -} diff --git a/paimon-spark/paimon-spark-common/src/test/scala/org/apache/paimon/spark/sql/DDLTestBase.scala b/paimon-spark/paimon-spark-common/src/test/scala/org/apache/paimon/spark/sql/DDLTestBase.scala new file mode 100644 index 000000000..8bb3bd5e8 --- /dev/null +++ b/paimon-spark/paimon-spark-common/src/test/scala/org/apache/paimon/spark/sql/DDLTestBase.scala @@ -0,0 +1,61 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.paimon.spark.sql + +import org.apache.paimon.spark.PaimonSparkTestBase + +import org.junit.jupiter.api.Assertions + +abstract class DDLTestBase extends PaimonSparkTestBase { + + import testImplicits._ + + test("Paimon: Create Table As Select") { + withTable("source", "t1", "t2") { + Seq((1L, "x1", "2023"), (2L, "x2", "2023")) + .toDF("a", "b", "pt") + .createOrReplaceTempView("source") + + spark.sql(""" + |CREATE TABLE t1 AS SELECT * FROM source + |""".stripMargin) + val t1 = loadTable("t1") + Assertions.assertTrue(t1.primaryKeys().isEmpty) + Assertions.assertTrue(t1.partitionKeys().isEmpty) + + spark.sql( + """ + |CREATE TABLE t2 + |PARTITIONED BY (pt) + |TBLPROPERTIES ('bucket' = '5', 'primary-key' = 'a,pt', 'target-file-size' = '128MB') + |AS SELECT * FROM source + |""".stripMargin) + val t2 = loadTable("t2") + Assertions.assertEquals(2, t2.primaryKeys().size()) + Assertions.assertTrue(t2.primaryKeys().contains("a")) + Assertions.assertTrue(t2.primaryKeys().contains("pt")) + Assertions.assertEquals(1, t2.partitionKeys().size()) + Assertions.assertEquals("pt", t2.partitionKeys().get(0)) + + // check all the core options + Assertions.assertEquals("5", t2.options().get("bucket")) + Assertions.assertEquals("128MB", t2.options().get("target-file-size")) + } + } + +}
