将数据导出到外部表

可以通过定义外部表并将数据导出到其中来导出数据。 表属性在创建外部表时指定。 export 命令按名称引用外部表。

该命令需要表管理员或数据库管理员权限

语法

.export [async] to table ExternalTableName
[with (PropertyName = PropertyValue,...)] <| Query

参数

  • ExternalTableName:要将内容导出到其中的外部表的名称。
  • Query:导出查询。

属性

支持将以下属性作为“导出到外部表”命令的一部分:

属性 类型 说明 默认
distributed bool 禁用/启用分布式导出。 设置为 false 等效于 single 分布提示。 默认值为 true。
concurrency 数字 提示系统要并行运行的分区数量。 参阅下面的说明。 默认值为 16。
spread 数字 提示系统如何在群集节点之间分配分区。 例如,如果有 N 个分区,并且扩展提示设置为 P,则 N 个分区将由 P 个不同的群集节点平等并行/顺序地处理,具体取决于并发提示。 参阅下面的说明。 默认值为 1。
parquetRowGroupSize int 只有数据格式为 Parquet 时才相关。 控制已导出文件中的行组大小。 默认的行组大小为 100000 条记录。
sizeLimit long 在压缩之前要写入的单个存储项目的大小限制(字节)。 允许的范围为 100MB(默认值)到 1GB。

备注

hint.spreadhint.concurrency 是用于减少/增加写入操作并发度的属性。 有关更多详细信息,请参阅 partition 运算符。 只有在导出到由字符串分区进行分区的外部表时,这些属性才有意义。 默认情况下,以并发方式进行导出的节点的数量将会是 64 和群集节点数之间的最小值。

输出

输出参数 类型 说明
ExternalTableName String 外部表的名称。
Path String 输出路径。
NumRecords String 导出到路径的记录数。

注释

  • 导出查询输出架构必须与外部表的架构(包括分区定义的所有列)匹配。 例如,如果表按 DateTime 分区,则查询输出架构必须具有与 TimestampColumnName 匹配的 Timestamp 列。 此列名在外部表分区定义中定义。

  • 不能使用 export 命令重写外部表属性。 例如,不能将 Parquet 格式的数据导出到数据格式为 CSV 的外部表。

  • 如果外部表已分区,则导出的项目将根据分区定义写入到各自的目录,如已分区外部表示例中所示。

    • 如果分区值为 NULL 或为空,或者是无效的目录值,则根据目标存储的定义,分区值将替换为默认值 __DEFAULT_PARTITION__
  • 有关解决导出命令过程中出现的存储错误的建议,请参阅导出命令过程中的失败

  • 根据数据类型映射规则,将外部表列映射到合适的目标格式数据类型。

文件的数目

每个分区写入的文件数取决于设置:

  • 如果外部表只包含日期/时间分区或者根本不包含分区,则每个分区(如果存在)写入的文件数应该与群集中的节点数相似(如果达到 sizeLimit,则需增加该数目)。 分发导出操作后,群集中的所有节点将同时导出。 若要禁用分发,以便仅单个节点执行写操作,请将 distributed 设为 false。 此过程会创建较少的文件,但会降低导出性能。

  • 如果外部表通过一个字符串列包含一个分区,则导出的文件数应为每个分区一个文件(如果达到 sizeLimit,则需增加该数目)。 所有节点仍参与导出(操作已分发),但每个分区将分配给特定节点。 将 distributed 设为 false 会导致只有单个节点进行导出,但行为将保持不变(每个分区写入一个文件)。

示例

未分区外部表示例

ExternalBlob 是未分区外部表。

.export to table ExternalBlob <| T
ExternalTableName Path NumRecords
ExternalBlob http://storage1.blob.core.chinacloudapi.cn/externaltable1cont1/1_58017c550b384c0db0fea61a8661333e.csv 10

已分区外部表示例

PartitionedExternalBlob 是一个外部表,定义如下:

.create external table PartitionedExternalBlob (Timestamp:datetime, CustomerName:string) 
kind=blob
partition by (CustomerName:string=CustomerName, Date:datetime=startofday(Timestamp))   
pathformat = ("CustomerName=" CustomerName "/" datetime_pattern("yyyy/MM/dd", Date))   
dataformat=csv
( 
   h@'http://storageaccount.blob.core.chinacloudapi.cn/container1;secretKey'
)
.export to table PartitionedExternalBlob <| T
ExternalTableName Path NumRecords
ExternalBlob http://storageaccount.blob.core.chinacloudapi.cn/container1/CustomerName=customer1/2019/01/01/fa36f35c-c064-414d-b8e2-e75cf157ec35_1_58017c550b384c0db0fea61a8661333e.csv 10
ExternalBlob http://storageaccount.blob.core.chinacloudapi.cn/container1/CustomerName=customer2/2019/01/01/fa36f35c-c064-414d-b8e2-e75cf157ec35_2_b785beec2c004d93b7cd531208424dc9.csv 10

如果命令是异步执行的(通过使用 async 关键字),则可以使用 show operation details 命令获得输出。