⌘+k ctrl+k
1.1.3 (stable)
Search Shortcut cmd + k | ctrl + k
Partitioned Writes

Examples

将表写入Parquet文件的Hive分区数据集:

COPY orders TO 'orders' (FORMAT PARQUET, PARTITION_BY (year, month));

将表写入CSV文件的Hive分区数据集,允许覆盖:

COPY orders TO 'orders' (FORMAT CSV, PARTITION_BY (year, month), OVERWRITE_OR_IGNORE);

将表写入GZIP压缩的CSV文件的Hive分区数据集,设置明确的数据文件扩展名:

COPY orders TO 'orders' (FORMAT CSV, PARTITION_BY (year, month), COMPRESSION GZIP, FILE_EXTENSION 'csv.gz');

分区写入

当为COPY statement指定PARTITION_BY子句时,文件将以Hive分区的文件夹层次结构写入。目标是根目录的名称(在上面的示例中为orders)。文件按顺序写入文件层次结构中。目前,每个线程会为每个目录写入一个文件。

orders
├── year=2021
│    ├── month=1
│    │   ├── data_1.parquet
│    │   └── data_2.parquet
│    └── month=2
│        └── data_1.parquet
└── year=2022
     ├── month=11
     │   ├── data_1.parquet
     │   └── data_2.parquet
     └── month=12
         └── data_1.parquet

分区的值会自动从数据中提取。请注意,写入许多分区可能会非常昂贵,因为会创建许多文件。理想的分区数量取决于您的数据集有多大。

最佳实践 将数据写入许多小分区是昂贵的。通常建议每个分区至少有100 MB的数据。

覆盖

默认情况下,分区写入不允许覆盖现有目录。使用OVERWRITE_OR_IGNORE选项以允许覆盖现有目录。

文件名模式

默认情况下,文件将被命名为 data_0.parquetdata_0.csv。使用标志 FILENAME_PATTERN 可以定义一个包含 {i}{uuid} 的模式来创建特定的文件名:

  • {i} 将被一个索引替换
  • {uuid} 将被替换为一个128位长的UUID

将表写入一个Hive分区的.parquet文件数据集,文件名中包含索引:

COPY orders TO 'orders'
    (FORMAT PARQUET, PARTITION_BY (year, month), OVERWRITE_OR_IGNORE, FILENAME_PATTERN 'orders_{i}');

将表写入具有唯一文件名的.parquet文件的Hive分区数据集:

COPY orders TO 'orders'
    (FORMAT PARQUET, PARTITION_BY (year, month), OVERWRITE_OR_IGNORE, FILENAME_PATTERN 'file_{uuid}');