Databricksにおけるパーティションの取り扱い

[Partitions \| Databricks on AWS](https://docs.databricks.com/spark/latest/spark-sql/language-manual/sql-ref-partition.html) [2022/3/10時点]の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

パーティションとは、事前に定義される*パーティショニングカラム*と呼ばれるカラムのサブセットで同じ値を共有するテーブル内の行のサブセットから構成されます。パーティションを用いることで、テーブルに対するクエリーやデータの操作を高速化することができます。

パーティションを用いるには、テーブルを作成する際に[PARTITIONED BY](https://docs.databricks.com/spark/latest/spark-sql/language-manual/sql-ref-partition.html#partitioned-by)を追加することで、パーティショニングカラムのセットを定義します。

テーブルに行を挿入したり、行を操作する際、Databricksランタイムが自動的に行を適切なパーティションにディスパッチします。

[PARTITION](https://docs.databricks.com/spark/latest/spark-sql/language-manual/sql-ref-partition.html#partition)句を用いて、直接パーティションを指定することもできます。

Delta Lakeフォーマットを用いたいテーブルに対してもこの構文は有効であり、ALTER TABLE文を用いることでクイックにパーティションのDROP、ADD、RENAMEが可能です。

# PARTITIONED BY

`PARTITIONED BY`句を用いて、新規テーブルをどのカラムでパーティショニングするのかをカラムのリストで指定します。

## 構文

```sql:SQL
PARTITIONED BY ( { partition_column [ column_type ] } [, ...] )
```

## パラメーター

- [**partition\_column**](https://docs.databricks.com/spark/latest/spark-sql/language-manual/sql-ref-identifiers.html)
    識別子はテーブルの`column_identifier`を参照する場合があります。2つ以上のカラムを指定する場合、重複してはいけません。テーブルの`column_specification`のすべてのカラムを参照した場合、エラーとなります。

- [**column\_type**](https://docs.databricks.com/spark/latest/spark-sql/language-manual/sql-ref-datatypes.html)
    `partition_column`がテーブルの`column_specification`上の`column_identifier`を参照しない限り、`column_type`が`partition_column`のデータ型を定義します。

    Databricksランタイムでサポートされているすべての[データ型](https://docs.databricks.com/spark/latest/spark-sql/language-manual/sql-ref-datatypes.html)が、すべてのデータソースでサポートされているわけではないことに注意してください。

## 注意

カラム指定にあるカラムを参照するDelta Lakeテーブルのパーティショニングカラムを定義しない場合、常にテーブルの末尾に移動されます。

# PARTITION

クエリーあるいは操作されるパーティションを特定するために`PARTITION`句を使用します。

カラムの全ての名前とそれぞれを値で紐づけることでパーティションが特定されます。特定の順序で指定する必要はありません。

既存テーブルに新規のパーティションを追加しないのであれば、オペレーションがカラムのサブセットにマッチするすべてのパーティションに適用されることを示すカラムや値を省略することができます。

```sql:SQL
PARTITION ( { partition_column  [ = partition_value | LIKE pattern ] } [ , ... ] )
```

## パラメーター

- [partition\_column](https://docs.databricks.com/spark/latest/spark-sql/language-manual/sql-ref-identifiers.html)
    テーブルのパーティションカラムとして指定するカラム。同じカラムを二回指定する必要はありません。
- `= partition_value`
    パーティションカラムの型とマッチするデータ型のリテラル。パーティションの値を省略すると、指定された内容はこのパーティションカラムのすべての値とマッチします。
- `LIKE pattern`
    この形式は[ALTER SHARE ADD TABLE](https://docs.databricks.com/spark/latest/spark-sql/language-manual/sql-ref-syntax-ddl-alter-share.html)でのみ利用できます。

    `pattern`に対して`partition_column`の文字列表現をマッチします。`pattern`は[LIKE](https://docs.databricks.com/spark/latest/spark-sql/language-manual/functions/like.html)で使われるような文字列リテラルでなくてはいけません。

# サンプル

```sql:SQL
-- Use the PARTTIONED BY clause in a table definition
> CREATE TABLE student(university STRING,
                       major      STRING,
                       name       STRING)
         PARTITIONED BY(university, major)

> CREATE TABLE professor(name STRING)
         PARTITIONED BY(university STRING,
                        department STRING);

-- Use the PARTITION specification to INSERT into a table
> INSERT INTO student
         PARTITION(university= 'TU Kaiserslautern') (major, name)
         SELECT major, name FROM freshmen;

-- Use the partition specification to add and drop a partition
> CREATE TABLE log(date DATE, id INT, event STRING)
     USING CSV LOCATION 'dbfs:/log'
     PARTITIONED BY (date);

> ALTER TABLE log ADD PARTIITON(date = DATE'2021-09-10');

> ALTER TABLE log DROP PARTITION(date = DATE'2021-09-10');

-- Drop all partitions from the named university, independent of the major.
> ALTER TABLE student DROP PARTITION(university = 'TU Kaiserslautern');
```

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)