blob: cab46f77dc58cb9a90face1dc181e4a4cdfbbeba [file] [log] [blame] [view]
---
title: "Catalog API"
weight: 4
type: docs
aliases:
- /api/catalog-api.html
---
<!--
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.
-->
# Catalog API
## Create Database
You can use the catalog to create databases. The created databases are persistence in the file system.
```java
import org.apache.paimon.catalog.Catalog;
public class CreateDatabase {
public static void main(String[] args) {
try {
Catalog catalog = CreateCatalog.createFilesystemCatalog();
catalog.createDatabase("my_db", false);
} catch (Catalog.DatabaseAlreadyExistException e) {
// do something
}
}
}
```
## Determine Whether Database Exists
You can use the catalog to determine whether the database exists
```java
import org.apache.paimon.catalog.Catalog;
public class DatabaseExists {
public static void main(String[] args) {
Catalog catalog = CreateCatalog.createFilesystemCatalog();
boolean exists = catalog.databaseExists("my_db");
}
}
```
## List Databases
You can use the catalog to list databases.
```java
import org.apache.paimon.catalog.Catalog;
import java.util.List;
public class ListDatabases {
public static void main(String[] args) {
Catalog catalog = CreateCatalog.createFilesystemCatalog();
List<String> databases = catalog.listDatabases();
}
}
```
## Drop Database
You can use the catalog to drop database.
```java
import org.apache.paimon.catalog.Catalog;
public class DropDatabase {
public static void main(String[] args) {
try {
Catalog catalog = CreateCatalog.createFilesystemCatalog();
catalog.dropDatabase("my_db", false, true);
} catch (Catalog.DatabaseNotEmptyException e) {
// do something
} catch (Catalog.DatabaseNotExistException e) {
// do something
}
}
}
```
## Alter Database
You can use the catalog to alter database's properties.(ps: only support hive and jdbc catalog)
```java
import java.util.ArrayList;
import org.apache.paimon.catalog.Catalog;
public class AlterDatabase {
public static void main(String[] args) {
try {
Catalog catalog = CreateCatalog.createHiveCatalog();
List<DatabaseChange> changes = new ArrayList<>();
changes.add(DatabaseChange.setProperty("k1", "v1"));
changes.add(DatabaseChange.removeProperty("k2"));
catalog.alterDatabase("my_db", changes, true);
} catch (Catalog.DatabaseNotExistException e) {
// do something
}
}
}
```
## Determine Whether Table Exists
You can use the catalog to determine whether the table exists
```java
import org.apache.paimon.catalog.Catalog;
import org.apache.paimon.catalog.Identifier;
public class TableExists {
public static void main(String[] args) {
Identifier identifier = Identifier.create("my_db", "my_table");
Catalog catalog = CreateCatalog.createFilesystemCatalog();
boolean exists = catalog.tableExists(identifier);
}
}
```
## List Tables
You can use the catalog to list tables.
```java
import org.apache.paimon.catalog.Catalog;
import java.util.List;
public class ListTables {
public static void main(String[] args) {
try {
Catalog catalog = CreateCatalog.createFilesystemCatalog();
List<String> tables = catalog.listTables("my_db");
} catch (Catalog.DatabaseNotExistException e) {
// do something
}
}
}
```
## Drop Table
You can use the catalog to drop table.
```java
import org.apache.paimon.catalog.Catalog;
import org.apache.paimon.catalog.Identifier;
public class DropTable {
public static void main(String[] args) {
Identifier identifier = Identifier.create("my_db", "my_table");
try {
Catalog catalog = CreateCatalog.createFilesystemCatalog();
catalog.dropTable(identifier, false);
} catch (Catalog.TableNotExistException e) {
// do something
}
}
}
```
## Rename Table
You can use the catalog to rename a table.
```java
import org.apache.paimon.catalog.Catalog;
import org.apache.paimon.catalog.Identifier;
public class RenameTable {
public static void main(String[] args) {
Identifier fromTableIdentifier = Identifier.create("my_db", "my_table");
Identifier toTableIdentifier = Identifier.create("my_db", "test_table");
try {
Catalog catalog = CreateCatalog.createFilesystemCatalog();
catalog.renameTable(fromTableIdentifier, toTableIdentifier, false);
} catch (Catalog.TableAlreadyExistException e) {
// do something
} catch (Catalog.TableNotExistException e) {
// do something
}
}
}
```
## Alter Table
You can use the catalog to alter a table, but you need to pay attention to the following points.
- Column %s cannot specify NOT NULL in the %s table.
- Cannot update partition column type in the table.
- Cannot change nullability of primary key.
- If the type of the column is nested row type, update the column type is not supported.
- Update column to nested row type is not supported.
```java
import org.apache.paimon.catalog.Catalog;
import org.apache.paimon.catalog.Identifier;
import org.apache.paimon.schema.Schema;
import org.apache.paimon.schema.SchemaChange;
import org.apache.paimon.types.DataField;
import org.apache.paimon.types.DataTypes;
import com.google.common.collect.Lists;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
public class AlterTable {
public static void main(String[] args) {
Identifier identifier = Identifier.create("my_db", "my_table");
Map<String, String> options = new HashMap<>();
options.put("bucket", "4");
Catalog catalog = CreateCatalog.createFilesystemCatalog();
catalog.createDatabase("my_db", false);
try {
catalog.createTable(
identifier,
new Schema(
Lists.newArrayList(
new DataField(0, "col1", DataTypes.STRING(), "field1"),
new DataField(1, "col2", DataTypes.STRING(), "field2"),
new DataField(2, "col3", DataTypes.STRING(), "field3"),
new DataField(3, "col4", DataTypes.BIGINT(), "field4"),
new DataField(
4,
"col5",
DataTypes.ROW(
new DataField(
5, "f1", DataTypes.STRING(), "f1"),
new DataField(
6, "f2", DataTypes.STRING(), "f2"),
new DataField(
7, "f3", DataTypes.STRING(), "f3")),
"field5"),
new DataField(8, "col6", DataTypes.STRING(), "field6")),
Lists.newArrayList("col1"), // partition keys
Lists.newArrayList("col1", "col2"), // primary key
options,
"table comment"),
false);
} catch (Catalog.TableAlreadyExistException e) {
// do something
} catch (Catalog.DatabaseNotExistException e) {
// do something
}
// add option
SchemaChange addOption = SchemaChange.setOption("snapshot.time-retained", "2h");
// add column
SchemaChange addColumn = SchemaChange.addColumn("col1_after", DataTypes.STRING());
// add a column after col1
SchemaChange.Move after = SchemaChange.Move.after("col1_after", "col1");
SchemaChange addColumnAfterField =
SchemaChange.addColumn("col7", DataTypes.STRING(), "", after);
// rename column
SchemaChange renameColumn = SchemaChange.renameColumn("col3", "col3_new_name");
// drop column
SchemaChange dropColumn = SchemaChange.dropColumn("col6");
// update column comment
SchemaChange updateColumnComment =
SchemaChange.updateColumnComment(new String[]{"col4"}, "col4 field");
// update nested column comment
SchemaChange updateNestedColumnComment =
SchemaChange.updateColumnComment(new String[]{"col5", "f1"}, "col5 f1 field");
// update column type
SchemaChange updateColumnType = SchemaChange.updateColumnType("col4", DataTypes.DOUBLE());
// update column position, you need to pass in a parameter of type Move
SchemaChange updateColumnPosition =
SchemaChange.updateColumnPosition(SchemaChange.Move.first("col4"));
// update column nullability
SchemaChange updateColumnNullability =
SchemaChange.updateColumnNullability(new String[]{"col4"}, false);
// update nested column nullability
SchemaChange updateNestedColumnNullability =
SchemaChange.updateColumnNullability(new String[]{"col5", "f2"}, false);
SchemaChange[] schemaChanges =
new SchemaChange[]{
addOption,
removeOption,
addColumn,
addColumnAfterField,
renameColumn,
dropColumn,
updateColumnComment,
updateNestedColumnComment,
updateColumnType,
updateColumnPosition,
updateColumnNullability,
updateNestedColumnNullability
};
try {
catalog.alterTable(identifier, Arrays.asList(schemaChanges), false);
} catch (Catalog.TableNotExistException e) {
// do something
} catch (Catalog.ColumnAlreadyExistException e) {
// do something
} catch (Catalog.ColumnNotExistException e) {
// do something
}
}
}
```