This is an automated email from the ASF dual-hosted git repository.
lzljs3620320 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/paimon.git
The following commit(s) were added to refs/heads/master by this push:
new e53e8c519 [core] Adjust create partition interface (#4334)
e53e8c519 is described below
commit e53e8c519d0e004d8ae2b3378a319ad809da1c1b
Author: Jingsong Lee <[email protected]>
AuthorDate: Wed Oct 16 12:20:41 2024 +0800
[core] Adjust create partition interface (#4334)
---
.../org/apache/paimon/catalog/AbstractCatalog.java | 42 ++++++++---------
.../java/org/apache/paimon/catalog/Catalog.java | 10 +++++
.../org/apache/paimon/catalog/DelegateCatalog.java | 8 +---
.../java/org/apache/paimon/flink/FlinkCatalog.java | 7 +--
.../java/org/apache/paimon/hive/HiveCatalog.java | 17 -------
.../paimon/spark/PaimonPartitionManagement.scala | 52 +++++++++++-----------
6 files changed, 60 insertions(+), 76 deletions(-)
diff --git
a/paimon-core/src/main/java/org/apache/paimon/catalog/AbstractCatalog.java
b/paimon-core/src/main/java/org/apache/paimon/catalog/AbstractCatalog.java
index 2542d3777..276d75af4 100644
--- a/paimon-core/src/main/java/org/apache/paimon/catalog/AbstractCatalog.java
+++ b/paimon-core/src/main/java/org/apache/paimon/catalog/AbstractCatalog.java
@@ -41,9 +41,6 @@ import org.apache.paimon.table.sink.BatchWriteBuilder;
import org.apache.paimon.table.system.SystemTableLoader;
import org.apache.paimon.utils.Preconditions;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
import javax.annotation.Nullable;
import java.io.IOException;
@@ -72,9 +69,6 @@ public abstract class AbstractCatalog implements Catalog {
protected final FileIO fileIO;
protected final Map<String, String> tableDefaultOptions;
protected final Options catalogOptions;
- public MetastoreClient metastoreClient;
-
- private static final Logger LOG =
LoggerFactory.getLogger(AbstractCatalog.class);
@Nullable protected final LineageMetaFactory lineageMetaFactory;
@@ -162,23 +156,29 @@ public abstract class AbstractCatalog implements Catalog {
protected abstract Map<String, String> loadDatabasePropertiesImpl(String
name)
throws DatabaseNotExistException;
+ @Override
public void createPartition(Identifier identifier, Map<String, String>
partitionSpec)
throws TableNotExistException {
- TableSchema tableSchema = getDataTableSchema(identifier);
- if (!tableSchema.partitionKeys().isEmpty()
- && new
CoreOptions(tableSchema.options()).partitionedTableInMetastore()) {
- try {
- // Do not close client, it is for HiveCatalog
- if (metastoreClient == null) {
- throw new UnsupportedOperationException(
- "Only Support HiveCatalog in create partition!");
- }
- metastoreClient.addPartition(new
LinkedHashMap<>(partitionSpec));
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
- } else {
- throw new RuntimeException("the table is not partitioned table in
metastore!");
+ Identifier tableIdentifier =
+ Identifier.create(identifier.getDatabaseName(),
identifier.getTableName());
+ FileStoreTable table = (FileStoreTable) getTable(tableIdentifier);
+
+ if (table.partitionKeys().isEmpty() ||
!table.coreOptions().partitionedTableInMetastore()) {
+ throw new UnsupportedOperationException(
+ "The table is not partitioned table in metastore.");
+ }
+
+ MetastoreClient.Factory metastoreFactory =
+ table.catalogEnvironment().metastoreClientFactory();
+ if (metastoreFactory == null) {
+ throw new UnsupportedOperationException(
+ "The catalog must have metastore to create partition.");
+ }
+
+ try (MetastoreClient client = metastoreFactory.create()) {
+ client.addPartition(new LinkedHashMap<>(partitionSpec));
+ } catch (Exception e) {
+ throw new RuntimeException(e);
}
}
diff --git a/paimon-core/src/main/java/org/apache/paimon/catalog/Catalog.java
b/paimon-core/src/main/java/org/apache/paimon/catalog/Catalog.java
index 106f7b15a..9f069dc36 100644
--- a/paimon-core/src/main/java/org/apache/paimon/catalog/Catalog.java
+++ b/paimon-core/src/main/java/org/apache/paimon/catalog/Catalog.java
@@ -262,6 +262,16 @@ public interface Catalog extends AutoCloseable {
*/
default void invalidateTable(Identifier identifier) {}
+ /**
+ * Create the partition of the specify table.
+ *
+ * @param identifier path of the table to drop partition
+ * @param partitionSpec the partition to be created
+ * @throws TableNotExistException if the table does not exist
+ */
+ void createPartition(Identifier identifier, Map<String, String>
partitionSpec)
+ throws TableNotExistException;
+
/**
* Drop the partition of the specify table.
*
diff --git
a/paimon-core/src/main/java/org/apache/paimon/catalog/DelegateCatalog.java
b/paimon-core/src/main/java/org/apache/paimon/catalog/DelegateCatalog.java
index 53d764f89..814de16d6 100644
--- a/paimon-core/src/main/java/org/apache/paimon/catalog/DelegateCatalog.java
+++ b/paimon-core/src/main/java/org/apache/paimon/catalog/DelegateCatalog.java
@@ -140,14 +140,10 @@ public class DelegateCatalog implements Catalog {
return wrapped.getTableLocation(identifier);
}
+ @Override
public void createPartition(Identifier identifier, Map<String, String>
partitions)
throws TableNotExistException {
- if (wrapped instanceof AbstractCatalog) {
- ((AbstractCatalog) wrapped).createPartition(identifier,
partitions);
- } else {
- throw new UnsupportedOperationException(
- "Only Support HiveCatalog in create partition!");
- }
+ wrapped.createPartition(identifier, partitions);
}
@Override
diff --git
a/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/FlinkCatalog.java
b/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/FlinkCatalog.java
index 7e006185c..633fa9c4b 100644
---
a/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/FlinkCatalog.java
+++
b/paimon-flink/paimon-flink-common/src/main/java/org/apache/paimon/flink/FlinkCatalog.java
@@ -101,7 +101,6 @@ import org.slf4j.LoggerFactory;
import javax.annotation.Nullable;
-import java.lang.reflect.Method;
import java.time.Duration;
import java.util.ArrayList;
import java.util.Arrays;
@@ -1156,10 +1155,8 @@ public class FlinkCatalog extends AbstractCatalog {
try {
Identifier identifier = toIdentifier(tablePath);
- Method func =
- catalog.getClass().getMethod("createPartition",
Identifier.class, Map.class);
- func.invoke(catalog, identifier, partitionSpec.getPartitionSpec());
- } catch (Exception e) {
+ catalog.createPartition(identifier,
partitionSpec.getPartitionSpec());
+ } catch (Catalog.TableNotExistException e) {
throw new CatalogException(e);
}
}
diff --git
a/paimon-hive/paimon-hive-catalog/src/main/java/org/apache/paimon/hive/HiveCatalog.java
b/paimon-hive/paimon-hive-catalog/src/main/java/org/apache/paimon/hive/HiveCatalog.java
index e84222bd9..4d9c482a2 100644
---
a/paimon-hive/paimon-hive-catalog/src/main/java/org/apache/paimon/hive/HiveCatalog.java
+++
b/paimon-hive/paimon-hive-catalog/src/main/java/org/apache/paimon/hive/HiveCatalog.java
@@ -310,23 +310,6 @@ public class HiveCatalog extends AbstractCatalog {
return properties;
}
- @Override
- public void createPartition(Identifier identifier, Map<String, String>
partitionSpec)
- throws TableNotExistException {
- try {
- TableSchema tableSchema = getDataTableSchema(identifier);
- metastoreClient =
- new HiveMetastoreClient(
- new Identifier(identifier.getDatabaseName(),
identifier.getTableName()),
- tableSchema,
- clients);
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
-
- super.createPartition(identifier, partitionSpec);
- }
-
@Override
public void dropPartition(Identifier identifier, Map<String, String>
partitionSpec)
throws TableNotExistException {
diff --git
a/paimon-spark/paimon-spark-common/src/main/scala/org/apache/paimon/spark/PaimonPartitionManagement.scala
b/paimon-spark/paimon-spark-common/src/main/scala/org/apache/paimon/spark/PaimonPartitionManagement.scala
index 8bf816417..23a7ac06b 100644
---
a/paimon-spark/paimon-spark-common/src/main/scala/org/apache/paimon/spark/PaimonPartitionManagement.scala
+++
b/paimon-spark/paimon-spark-common/src/main/scala/org/apache/paimon/spark/PaimonPartitionManagement.scala
@@ -18,7 +18,6 @@
package org.apache.paimon.spark
-import org.apache.paimon.catalog.Identifier
import org.apache.paimon.metastore.MetastoreClient
import org.apache.paimon.operation.FileStoreCommit
import org.apache.paimon.table.FileStoreTable
@@ -32,7 +31,8 @@ import org.apache.spark.sql.catalyst.util.CharVarcharUtils
import org.apache.spark.sql.connector.catalog.SupportsAtomicPartitionManagement
import org.apache.spark.sql.types.StructType
-import java.util.{LinkedHashMap, Map => JMap, Objects, UUID}
+import java.util
+import java.util.{Map => JMap, Objects, UUID}
import scala.collection.JavaConverters._
@@ -43,7 +43,8 @@ trait PaimonPartitionManagement extends
SupportsAtomicPartitionManagement {
override lazy val partitionSchema: StructType =
SparkTypeUtils.fromPaimonRowType(partitionRowType)
- override def dropPartitions(internalRows: Array[InternalRow]): Boolean = {
+ private def toPaimonPartitions(
+ rows: Array[InternalRow]): Array[java.util.LinkedHashMap[String,
String]] = {
table match {
case fileStoreTable: FileStoreTable =>
val rowConverter = CatalystTypeConverters
@@ -53,12 +54,20 @@ trait PaimonPartitionManagement extends
SupportsAtomicPartitionManagement {
partitionRowType,
table.partitionKeys().asScala.toArray)
- val partitions = internalRows.map {
+ rows.map {
r =>
rowDataPartitionComputer
.generatePartValues(new SparkRow(partitionRowType,
rowConverter(r).asInstanceOf[Row]))
- .asInstanceOf[JMap[String, String]]
}
+ case _ =>
+ throw new UnsupportedOperationException("Only FileStoreTable supports
partitions.")
+ }
+ }
+
+ override def dropPartitions(rows: Array[InternalRow]): Boolean = {
+ table match {
+ case fileStoreTable: FileStoreTable =>
+ val partitions =
toPaimonPartitions(rows).map(_.asInstanceOf[JMap[String, String]])
val commit: FileStoreCommit =
fileStoreTable.store.newCommit(UUID.randomUUID.toString)
try {
commit.dropPartitions(partitions.toSeq.asJava,
BatchWriteBuilder.COMMIT_IDENTIFIER)
@@ -114,35 +123,24 @@ trait PaimonPartitionManagement extends
SupportsAtomicPartitionManagement {
}
override def createPartitions(
- internalRows: Array[InternalRow],
+ rows: Array[InternalRow],
maps: Array[JMap[String, String]]): Unit = {
table match {
case fileStoreTable: FileStoreTable =>
- val rowConverter = CatalystTypeConverters
-
.createToScalaConverter(CharVarcharUtils.replaceCharVarcharWithString(partitionSchema))
- val rowDataPartitionComputer = new InternalRowPartitionComputer(
- fileStoreTable.coreOptions().partitionDefaultName(),
- partitionRowType,
- table.partitionKeys().asScala.toArray)
- val partitions = internalRows.map {
- r =>
- rowDataPartitionComputer
- .generatePartValues(new SparkRow(partitionRowType,
rowConverter(r).asInstanceOf[Row]))
- .asInstanceOf[JMap[String, String]]
+ val partitions = toPaimonPartitions(rows)
+ val metastoreFactory =
fileStoreTable.catalogEnvironment().metastoreClientFactory()
+ if (metastoreFactory == null) {
+ throw new UnsupportedOperationException(
+ "The table must have metastore to create partition.")
}
- val metastoreClient: MetastoreClient =
- fileStoreTable.catalogEnvironment().metastoreClientFactory().create
- partitions.foreach {
- partition =>
-
metastoreClient.addPartition(partition.asInstanceOf[LinkedHashMap[String,
String]])
+ val metastoreClient: MetastoreClient = metastoreFactory.create
+ try {
+ partitions.foreach(metastoreClient.addPartition)
+ } finally {
+ metastoreClient.close()
}
case _ =>
throw new UnsupportedOperationException("Only FileStoreTable supports
create partitions.")
}
}
-
- def getIdentifierFromTableName(tableName: String): Identifier = {
- val name: Array[String] = tableName.split("\\.")
- new Identifier(name.apply(0), name.apply(1))
- }
}