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.parquet
或 data_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}');