

要获得与亚马逊 Timestream 类似的功能 LiveAnalytics，可以考虑适用于 InfluxDB 的亚马逊 Timestream。适用于 InfluxDB 的 Amazon Timestream 提供简化的数据摄取和个位数毫秒级的查询响应时间，以实现实时分析。点击[此处](https://docs.aws.amazon.com//timestream/latest/developerguide/timestream-for-influxdb.html)了解更多信息。

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用 UNLOAD 将查询结果从 Timestream 导出到 S3 LiveAnalytics
<a name="export-unload"></a>

 LiveAnalytics 目前，Amazon Timestream 允许您使用该语句以经济实惠且安全的方式将查询结果导出到 Amazon S3。`UNLOAD`使用 `UNLOAD` 语句，您现在能够以 Apache Parquet 或逗号分隔值（CSV）格式将时间序列数据导出至选定的 S3 存储桶，从而灵活地与其他服务结合使用，以存储、合并和分析时间序列数据。`UNLOAD` 语句允许您以压缩方式导出数据，从而减少传输的数据和所需的存储空间。`UNLOAD` 还支持在导出数据时根据所选属性进行分区，从而提升性能并缩短下游服务访问数据的处理时间。此外，您还可以使用 Amazon S3 托管密钥 (SSE-S3) 或密 AWS 钥管理服务 (AWS KMS) 托管密钥 (SSE-KMS) 对导出的数据进行加密。

## 从 Timestream 卸载的好处 LiveAnalytics
<a name="export-unload-benefits"></a>

使用 `UNLOAD` 语句的主要优势如下。
+ **操作简便**：使用 `UNLOAD` 语句，您可以在单个查询请求中以 Apache Parquet 或 CSV 格式导出数千兆字节的数据，既能灵活选择最适合下游处理需求的格式，又可轻松构建数据湖。
+ **安全且经济高效**：`UNLOAD` 语句支持以压缩方式将数据导出至 S3 存储桶，并使用客户托管的密钥对数据进行加密（SSE-KMS 或 SSE\$1S3），从而降低数据存储成本并防范未经授权的访问。
+ **性能**：使用 `UNLOAD` 语句，可在将数据导出至 S3 存储桶时进行分区。对数据进行分区使下游服务能够并行处理数据，从而缩短其处理时间。此外，下游服务仅需处理所需数据，从而减少所需的处理资源，进而降低相关成本。

## 从 Timestream 卸载的用例 LiveAnalytics
<a name="export-unload-use-cases"></a>

您可以使用 `UNLOAD` 语句，将数据写入 S3 存储桶。
+ **构建数据仓库**：您可以将数千兆字节的查询结果导出至 S3 存储桶，并更轻松地将时间序列数据添加到数据湖中。您可以使用 Amazon Athena 和 Amazon Redshift 等服务，将时间序列数据与其他相关数据结合，从而获得复杂的业务见解。
+ **构建 AI 和 ML 数据管道** — 该`UNLOAD`语句使您能够轻松地为访问时序数据的机器学习模型构建数据管道，从而更轻松地将时间序列数据与 Amazon SageMaker 和 Amazon EMR 等服务一起使用。
+ **简化 ETL 处理** — 将数据导出到 S3 存储桶可以简化对数据执行提取、转换、加载 (ETL) 操作的过程，使您能够无缝使用第三方工具或 AWS 服务（例如 G AWS lue）来处理和转换数据。

# UNLOAD 概念
<a name="export-unload-concepts"></a>

## 语法
<a name="export-unload-concepts-syntax"></a>

```
UNLOAD (SELECT statement)
 TO 's3://bucket-name/folder'
 WITH ( option = expression [, ...] )
```

其中 `option` 为

```
{ partitioned_by = ARRAY[ col_name[,…] ] 
 | format = [ '{ CSV | PARQUET }' ] 
 | compression = [ '{ GZIP | NONE }' ]
 | encryption = [ '{ SSE_KMS | SSE_S3 }' ]
 | kms_key = '<string>'
 | field_delimiter ='<character>'
 | escaped_by = '<character>'
 | include_header = ['{true, false}']
 | max_file_size = '<value>'
 | }
```

## 参数
<a name="export-unload-concepts-parameters"></a>

SELECT 语句  
用于从一个或多个 Timestream 中为 LiveAnalytics 表选择和检索数据的查询语句。  

```
(SELECT column 1, column 2, column 3 from database.table
      where measure_name = "ABC" and timestamp between ago (1d) and now() )
```

TO 子句  

```
TO 's3://bucket-name/folder'
```
或者  

```
TO 's3://access-point-alias/folder'
```
`UNLOAD` 语句中的 `TO` 子句指定查询结果输出的目的地。您需要提供完整路径，包括 Amazon S3 存储桶名称或 Amazon S3，以及在 Amazon S3 access-point-alias 上 LiveAnalytics写入输出文件对象的 Timestream 上的文件夹位置。S3 存储桶应由同一账户拥有，且位于同一区域。除了查询结果集之外，Timestream 还会将清单和元数据文件 LiveAnalytics 写入指定的目标文件夹。

PARTITIONED\$1BY 子句  

```
partitioned_by = ARRAY [col_name[,…] , (default: none)
```
`partitioned_by` 子句用于在查询中按粒度级别对数据进行分组与分析。将查询结果导出至 S3 存储桶时，可以选择根据选择查询中的一个或多个列对数据进行分区。在对数据进行分区时，导出的数据会根据分区列划分为多个子集，每个子集存储在独立的文件夹中。在包含导出数据的结果文件夹中，将自动创建子文件夹 `folder/results/partition column = partition value/`。但请注意，分区列不会包含在输出文件中。  
`partitioned_by` 不是语法中的必选子句。如果选择不进行分区直接导出数据，可在语法中排除该子句。  

**Example**  
假设您正在监控网站的点击流数据，且有 5 个流量通道，即 `direct`、`Social Media`、`Organic Search`、`Other` 和 `Referral`。导出数据时，可选择使用列 `Channel` 对数据进行分区。在数据文件夹 `s3://bucketname/results` 中，您将包含五个分别以对应通道名称命名的文件夹，例如 `s3://bucketname/results/channel=Social Media/.`。在此文件夹中，您将找到所有通过 `Social Media` 通道访问您网站的客户数据。同样，您可为其余通道创建其他文件夹。
按通道列分区的导出数据  

![\[Folder structure showing channels: Direct, Organic search, Other, Referral, and Social media.\]](http://docs.aws.amazon.com/zh_cn/timestream/latest/developerguide/images/unload-results.png)


FORMAT  

```
format = [ '{ CSV | PARQUET }' , default: CSV
```
用于指定写入 S3 存储桶的查询结果格式的关键字。您可以使用逗号（,）作为默认分隔符，将数据导出为逗号分隔值（CSV）格式，也可以导出为 Apache Parquet 格式（一种用于分析的高效开放列式存储格式）。

COMPRESSION  

```
compression = [ '{ GZIP | NONE }' ], default: GZIP
```
您可以使用压缩算法 GZIP 对导出的数据进行压缩，也可以通过指定 `NONE` 选项将其解压缩。

ENCRYPTION  

```
encryption = [ '{ SSE_KMS | SSE_S3 }' ], default: SSE_S3
```
Amazon S3 上的输出文件会使用您选择的加密选项进行加密。除数据以外，清单文件和元数据文件也会根据您选择的加密选项进行加密。我们目前支持 SSE\$1S3 和 SSE\$1KMS 加密。SSE\$1S3 是一种服务器端加密，由 Amazon S3 使用 256 位高级加密标准（AES）加密对数据进行加密。SSE\$1KMS 是一种服务器端加密，用于使用客户托管的密钥对数据进行加密。

KMS\$1KEY  

```
kms_key = '<string>'
```
KMS 密钥是由客户定义的密钥，用于加密导出的查询结果。KMS 密钥由 AWS 密钥管理服务 (AWS KMS) 安全管理，用于加密 Amazon S3 上的数据文件。

FIELD\$1DELIMITER  

```
field_delimiter ='<character>' , default: (,)
```
以 CSV 格式导出数据时，此字段指定用于在输出文件中分隔字段的单个 ASCII 字符，如管道字符（\$1）、逗号（,）或制表符（/t）。CSV 文件的默认分隔符是逗号字符。如果数据中的某个值包含所选分隔符，则该分隔符将用引号字符进行引号处理。例如，如果数据中的值包含 `Time,stream`，则在导出数据中，该值将添加引号成为 `"Time,stream"`。Timestream 使用的引号字符 LiveAnalytics 是双引号 (“)。  
如果要在 CSV 中包含标题，请避免将回车符（ASCII 13、十六进制 `0D`、文本 '\$1r'）或换行符（ASCII 10、十六进制 0A、文本 '\$1n'）指定为 `FIELD_DELIMITER`，否则将导致多数解析器无法正确解析最终 CSV 输出中的标题。

ESCAPED\$1BY  

```
escaped_by = '<character>', default: (\)
```
以 CSV 格式导出数据时，此字段指定应在写入 S3 存储桶的数据文件中作为转义字符处理的字符。如果存在以下情形，可能会发生转义：  

1. 如果值本身包含引号字符（"），则将使用转义字符进行转义。例如，如果值为 `Time"stream`，其中（\$1）是已配置的转义字符，则将其转义为 `Time\"stream`。

1. 如果该值包含已配置的转义字符，则将对其进行转义。例如，如果值为 `Time\stream`，则将其转义为 `Time\\stream`。
如果导出的输出包含数组、行或时间序列等复杂数据类型，则会将其序列化为 JSON 字符串。以下为示例。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/timestream/latest/developerguide/export-unload-concepts.html)

INCLUDE\$1HEADER  

```
include_header = 'true' , default: 'false'
```
以 CSV 格式导出数据时，此字段允许您将列名作为导出 CSV 数据文件的首行。  
可接受的值为“true”和“false”，默认值为“false”。`escaped_by` 和 `field_delimiter` 等文本转换选项同样适用于标题。  
包含标题时，请避免使用回车符（ASCII 13、十六进制 0D、文本 '\$1r'）或换行符（ASCII 10、十六进制 0A、文本 '\$1n'）作为 `FIELD_DELIMITER`，否则将导致多数解析器无法正确解析最终 CSV 输出中的标题。

MAX\$1FILE\$1SIZE  

```
max_file_size = 'X[MB|GB]' , default: '78GB'
```
此字段指定 `UNLOAD` 语句在 Amazon S3 中创建的文件最大大小。`UNLOAD` 语句可创建多个文件，但写入 Amazon S3 的每个文件最大大小将大致等于此字段中指定的值。  
该字段的值必须在 16MB（含）和 78GB（含）之间。可以用整数（例如 `12GB`）或小数（例如 `0.5GB` 或 `24.7MB`）进行指定。默认值为 78 GB。  
写入文件时，实际文件大小是近似值，因此实际最大大小可能不完全等于您指定的数字。

## 写入 S3 存储桶的内容是什么？
<a name="export-unload-common-questions-what-is-written"></a>

对于每个成功执行的 UNLOAD 查询，Timestream for 都会将您的查询结果、元数据文件和清单文件 LiveAnalytics 写入 S3 存储桶。如果已对数据进行分区，则结果文件夹中包含所有分区文件夹。清单文件包含由 UNLOAD 命令写入的文件列表。元数据文件包含描述写入数据特征、属性和特性的信息。

## 导出的文件名是什么？
<a name="export-unload-common-questions-what-is-filename"></a>

导出的文件名包含两个组成部分，第一部分是 queryID，第二部分是唯一标识符。

CSV 文件

```
S3://bucket_name/results/<queryid>_<UUID>.csv
S3://bucket_name/results/<partitioncolumn>=<partitionvalue>/<queryid>_<UUID>.csv
```

压缩的 CSV 文件

```
S3://bucket_name/results/<partitioncolumn>=<partitionvalue>/<queryid>_<UUID>.gz 
```

Parquet 文件

```
S3://bucket_name/results/<partitioncolumn>=<partitionvalue>/<queryid>_<UUID>.parquet
```

元数据和清单文件

```
S3://bucket_name/<queryid>_<UUID>_manifest.json 
S3://bucket_name/<queryid>_<UUID>_metadata.json
```

由于 CSV 格式的数据存储在文件级别，因此在导出至 S3 时压缩数据，该文件将带有“.gz”扩展名。然而，Parquet 中的数据在列级别进行压缩，因此即使在导出时对数据进行压缩，该文件仍会保留 .parquet 扩展名。

## 每个文件包含哪些信息？
<a name="export-unload-common-questions-what-information"></a>

### 清单文件
<a name="export-unload-common-questions-what-information-manifest"></a>

清单文件提供有关执行 UNLOAD 时导出的文件列表信息。清单文件可在提供的 S3 存储桶中找到，文件名为：`s3://<bucket_name>/<queryid>_<UUID>_manifest.json`。清单文件将包含结果文件夹中文件的 URL、相应文件的记录数和大小，以及查询元数据（即该查询导出至 S3 的总字节数和总行数）。

```
{
  "result_files": [
    {
        "url":"s3://my_timestream_unloads/ec2_metrics/AEDAGANLHLBH4OLISD3CVOZZRWPX5GV2XCXRBKCVD554N6GWPWWXBP7LSG74V2Q_1448466917_szCL4YgVYzGXj2lS.gz", 
        "file_metadata": 
            { 
                "content_length_in_bytes": 32295, 
                "row_count": 10 
            }
    },
    {
        "url":"s3://my_timestream_unloads/ec2_metrics/AEDAGANLHLBH4OLISD3CVOZZRWPX5GV2XCXRBKCVD554N6GWPWWXBP7LSG74V2Q_1448466917_szCL4YgVYzGXj2lS.gz", 
        "file_metadata": 
            { 
                "content_length_in_bytes": 62295, 
                "row_count": 20 
            }
    },
  ],
  "query_metadata": 
    {
      "content_length_in_bytes": 94590, 
      "total_row_count": 30,
      "result_format": "CSV",
      "result_version": "Amazon Timestream version 1.0.0"  
    },
  "author": {
        "name": "Amazon Timestream", 
        "manifest_file_version": "1.0" 
  }
}
```

### 元数据
<a name="export-unload-common-questions-what-information-metadata"></a>

元数据文件提供有关数据集的其他信息，例如列名、列类型及架构。元数据文件位于提供的 S3 存储桶中，文件名为：S3://bucket\$1name/<queryid>\$1<UUID>\$1metadata.json 

以下是元数据文件的示例。

```
{
    "ColumnInfo": [
        {
            "Name": "hostname",
            "Type": {
                "ScalarType": "VARCHAR"
            }
        },
        {
            "Name": "region",
            "Type": {
                "ScalarType": "VARCHAR"
            }
        },
        {
            "Name": "measure_name",
            "Type": {
                "ScalarType": "VARCHAR"
            }
        },
        {
            "Name": "cpu_utilization",
            "Type": {
                "TimeSeriesMeasureValueColumnInfo": {
                    "Type": {
                        "ScalarType": "DOUBLE"
                    }
                }
            }
        }
  ],
  "Author": {
        "Name": "Amazon Timestream", 
        "MetadataFileVersion": "1.0" 
  }
}
```

元数据文件中共享的列信息与查询 API 响应中针对 `SELECT` 查询发送的 `ColumnInfo` 具有相同结构。

### 结果
<a name="export-unload-common-questions-what-information-results"></a>

结果文件夹包含以 Apache Parquet 或 CSV 格式导出的数据。

## 示例
<a name="export-unload-example-short"></a>

当通过查询 API 提交如下所示的 `UNLOAD` 查询时，

```
UNLOAD(SELECT user_id, ip_address, event, session_id, measure_name, time, query, quantity, product_id, channel 
                    FROM sample_clickstream.sample_shopping WHERE time BETWEEN ago(2d) AND now()) 
                TO 's3://my_timestream_unloads/withoutpartition/' WITH ( format='CSV', compression='GZIP')
```

`UNLOAD` 查询响应将包含 1 行 \$1 3 列。这 3 列包括：
+ BIGINT 类型的行：表示导出的行数
+ VARCHAR 类型的 metadataFile：所导出元数据文件的 S3 URI
+ VARCHAR 类型的 manifestFile：所导出清单文件的 S3 URI

您将从查询 API 获得以下响应：

```
{
    "Rows": [
        {
            "Data": [
                {
                    "ScalarValue": "20" # No of rows in output across all files
                },
                {
                    "ScalarValue": "s3://my_timestream_unloads/withoutpartition/AEDAAANGH3D7FYHOBQGQQMEAISCJ45B42OWWJMOT4N6RRJICZUA7R25VYVOHJIY_<UUID>_metadata.json" #Metadata file
                },
                {
                    "ScalarValue": "s3://my_timestream_unloads/withoutpartition/AEDAAANGH3D7FYHOBQGQQMEAISCJ45B42OWWJMOT4N6RRJICZUA7R25VYVOHJIY_<UUID>_manifest.json" #Manifest file
                }
            ]
        }
    ],
    "ColumnInfo": [
        {
            "Name": "rows",
            "Type": {
                "ScalarType": "BIGINT"
            }
        },
        {
            "Name": "metadataFile",
            "Type": {
                "ScalarType": "VARCHAR"
            }
        },
        {
            "Name": "manifestFile",
            "Type": {
                "ScalarType": "VARCHAR"
            }
        }
    ],
    "QueryId": "AEDAAANGH3D7FYHOBQGQQMEAISCJ45B42OWWJMOT4N6RRJICZUA7R25VYVOHJIY",
    "QueryStatus": {
        "ProgressPercentage": 100.0,
        "CumulativeBytesScanned": 1000,
        "CumulativeBytesMetered": 10000000
    }
}
```

## 数据类型
<a name="export-unload-data-types-explanation"></a>

该`UNLOAD`语句支持[支持的数据类型](supported-data-types.md)除和之外所述 LiveAnalytics的 Timestream 查询语言的所有数据类型`time`。`unknown`

# 从 Timestream 卸载的先决条件 LiveAnalytics
<a name="export-unload-prerequisites"></a>

以下是使用 `UNLOAD` Timestream for 将数据写入 S3 的 LiveAnalytics先决条件。
+ 您必须具有从 Timestream 读取数据的权限，才能在`UNLOAD`命令中使用 LiveAnalytics 表。
+ 您的 Amazon S3 存储桶必须与您的 Timestream 位于同一 AWS 区域才能存放 LiveAnalytics资源。
+ 对于选定的 S3 存储桶，请确保 [S3 存储桶策略](https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-bucket-policies.html)还具有允许 Timestream 导 LiveAnalytics 出数据的权限。
+ 用于执行`UNLOAD`查询的证书必须具有必要的 AWS 身份和访问管理 (IAM) 权限，允许 Timestream LiveAnalytics 将数据写入 S3。示例策略如下所示：

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [{
            "Effect": "Allow",
            "Action": [
                "timestream:Select",
                "timestream:ListMeasures",
                "timestream:WriteRecords",
                "timestream:Unload"
            ],
            "Resource": "arn:aws:timestream:us-east-2:111122223333:database/database_name/table/table_name"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetBucketAcl",
                "s3:PutObject",
                "s3:GetObject",
                "s3:AbortMultipartUpload"
            ],
            "Resource": [
                "arn:aws:s3:::S3_Bucket_Created",
                "arn:aws:s3:::S3_Bucket_Created/*"
            ]
        }
    ]
}
```

------

有关这些 S3 写入权限的更多上下文信息，请参阅 [Amazon Simple Storage Service 指南](https://docs.aws.amazon.com/AmazonS3/latest/userguide/mpuoverview.html#mpuAndPermissions)。如果使用 KMS 密钥对导出的数据进行加密，请参阅以下内容，以了解所需的其他 IAM 策略。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
      {
        "Effect": "Allow",
        "Action": [
            "kms:DescribeKey",
            "kms:Decrypt",
            "kms:GenerateDataKey*"
        ],
        "Resource": "arn:aws:kms:us-east-2:111122223333:key/*",
        "Condition": {
            "ForAnyValue:StringLike": {
                "kms:ResourceAliases": "alias/Alias_For_Generated_Key"
            }
        }
    }, {
        "Effect": "Allow",
        "Action": [
            "kms:CreateGrant"
        ],
        "Resource": "arn:aws:kms:us-east-2:111122223333:key/*",
        "Condition": {
            "ForAnyValue:StringEquals": {
                "kms:EncryptionContextKeys": "aws:timestream:database_name"
            },
            "Bool": {
                "kms:GrantIsForAWSResource": true
            },
            "StringLike": {
                "kms:ViaService": "timestream.us-east-2.amazonaws.com"
            },
            "ForAnyValue:StringLike": {
                "kms:ResourceAliases": "alias/Alias_For_Generated_Key"
            }
        }
    }
]
}
```

------

# 从 Timestream 卸载的最佳实践 LiveAnalytics
<a name="export-unload-best-practices"></a>

以下是与 UNLOAD 命令相关的最佳实践。
+ 使用 `UNLOAD` 命令导出至 S3 存储桶的数据量不受限制。然而，查询会在 60 分钟后超时，我们建议单个查询导出的数据量不超过 60GB。如果需要导出超过 60GB 的数据，请将任务拆分为多个查询。
+ 虽然可向 S3 发送数千个请求以上传数据，但建议将写入操作并行化到多个 S3 前缀。请参阅[此处](https://docs.aws.amazon.com/AmazonS3/latest/userguide/optimizing-performance.html)的文档。当多个人 readers/writers 访问同一个文件夹时，S3 API 的调用率可能会受到限制。
+ 。鉴于 S3 键长度对前缀定义的限制，我们建议将存储桶和文件夹名称控制在 10-15 个字符内，尤其是在使用 `partitioned_by` 子句时。
+ 当包含 `UNLOAD` 语句的查询返回 4XX 或 5XX 时，可能是部分结果已写入 S3 存储桶。的 Timestream LiveAnalytics 不会从您的存储桶中删除任何数据。在执行另一个具有相同 S3 目标的 `UNLOAD` 查询之前，我们建议手动删除由失败查询创建的文件。可以使用对应的 `QueryExecutionId` 识别由失败查询写入的文件。对于失败的查询，Timestream LiveAnalytics 不会将清单文件导出到 S3 存储桶。
+ Timestream for LiveAnalytics 使用分段上传将查询结果导出到 S3。当你收到来自 Timestream 的包含卸载语句的查询的 4XX 或 5XX 时，Timestream for 会尽力中止多部分上传，但可能会留下一些 LiveAnalytics 不完整的部分。 LiveAnalytics 因此，我们建议按照[此处](https://aws.amazon.com/blogs/aws-cloud-financial-management/discovering-and-deleting-incomplete-multipart-uploads-to-lower-amazon-s3-costs/)的指南，在 S3 存储桶中设置对未完成的分段上传进行自动清理。

## 使用 CSV 解析器访问 CSV 格式数据的建议
<a name="export-unload-common-questions-what-information-recommendations-csv"></a>
+ CSV 解析器不允许在分隔符、转义符和引号字符中使用相同的字符。
+ 某些 CSV 解析器无法处理数组等复杂数据类型，我们建议通过 JSON 反序列化器进行处理。

## 访问 Parquet 格式数据的建议
<a name="export-unload-common-questions-what-information-recommendations-parquet"></a>

1. 如果使用案例需要在架构（即列名）中支持 UTF-8 字符，我们建议使用 [Parquet-mr 库](https://github.com/apache/parquet-mr)。

1. 结果中的时间戳以 12 字节的整数表示 () INT96

1. 时间序列将表示为 `array<row<time, value>>`，其他嵌套结构将使用 Parquet 格式支持的相应数据类型

## 使用 partition\$1by 子句
<a name="export-unload-best-practices-partition-by"></a>
+ `partitioned_by` 字段中使用的列应为选择查询中的最后一列。如果 `partitioned_by` 字段中使用多个列，这些列应作为选择查询中的最后一列，且顺序应与 `partition_by` 字段中使用的顺序相同。
+ 用于对数据（`partitioned_by` 字段）进行分区的列值仅能包含 ASCII 字符。虽然 Timestream LiveAnalytics 允许在值中使用 UTF-8 字符，但 S3 仅支持 ASCII 字符作为对象键。

# 从 Timestream 卸载的示例用例 LiveAnalytics
<a name="export-unload-example-use-case"></a>

假设您正在监控电子商务网站的用户会话指标、流量来源以及产品购买情况。您正在使用Timestream LiveAnalytics 来获取有关用户行为、产品销售的实时见解，并对吸引客户访问网站的流量渠道（自然搜索、社交媒体、直接流量、付费广告系列等）进行营销分析。

**Topics**
+ [导出不带任何分区的数据](#export-unload-example-sample-1)
+ [按通道对数据进行分区](#export-unload-example-sample-2)
+ [按事件对数据进行分区](#export-unload-example-sample-3)
+ [按通道和事件对数据进行分区](#export-unload-example-sample-4)
+ [清单和元数据文件](#export-unload-example-manifest-metadata)
+ [使用 Glue 爬网程序构建 Glue 数据目录](#export-unload-example-using-glue-crawlers)

## 导出不带任何分区的数据
<a name="export-unload-example-sample-1"></a>

您希望以 CSV 格式导出过去两天的数据。

```
UNLOAD(SELECT user_id, ip_address, event, session_id, measure_name, time, 
query, quantity, product_id, channel 
FROM sample_clickstream.sample_shopping 
WHERE time BETWEEN ago(2d) AND now())  
TO 's3://<bucket_name>/withoutpartition' 
WITH (  format='CSV',   
compression='GZIP')
```

## 按通道对数据进行分区
<a name="export-unload-example-sample-2"></a>

您希望以 CSV 格式导出过去两天的数据，但想要将每个流量通道的数据放在单独的文件夹中。为此，您需要使用 `channel` 列对数据进行分区，如下所示。

```
UNLOAD(SELECT user_id, ip_address, event, session_id, measure_name, time, 
query, quantity, product_id, channel 
FROM sample_clickstream.sample_shopping 
WHERE time BETWEEN ago(2d) AND now())  
TO 's3://<bucket_name>/partitionbychannel/' 
WITH (  
partitioned_by = ARRAY ['channel'], 
format='CSV',   
compression='GZIP')
```

## 按事件对数据进行分区
<a name="export-unload-example-sample-3"></a>

您希望以 CSV 格式导出过去两天的数据，但想要将每个事件的数据放在单独的文件夹中。为此，您需要使用 `event` 列对数据进行分区，如下所示。

```
UNLOAD(SELECT user_id, ip_address, channel, session_id, measure_name, time, 
query, quantity, product_id, event 
FROM sample_clickstream.sample_shopping 
WHERE time BETWEEN ago(2d) AND now())  
TO 's3://<bucket_name>/partitionbyevent/' 
WITH (  
partitioned_by = ARRAY ['event'], 
format='CSV',   
compression='GZIP')
```

## 按通道和事件对数据进行分区
<a name="export-unload-example-sample-4"></a>

您希望以 CSV 格式导出过去两天的数据，但想要将每个通道的数据以及通道内每个文件放在单独的文件夹中。为此，您需要使用 `channel` 和 `event` 列对数据进行分区，如下所示。

```
UNLOAD(SELECT user_id, ip_address, session_id, measure_name, time, 
query, quantity, product_id, channel,event 
FROM sample_clickstream.sample_shopping 
WHERE time BETWEEN ago(2d) AND now())  
TO 's3://<bucket_name>/partitionbychannelevent/' 
WITH (  
partitioned_by = ARRAY ['channel','event'], 
format='CSV',   
compression='GZIP')
```

## 清单和元数据文件
<a name="export-unload-example-manifest-metadata"></a>

### 清单文件
<a name="export-unload-common-questions-what-information-manifest"></a>

清单文件提供有关执行 UNLOAD 时导出的文件列表信息。清单文件可在提供的 S3 存储桶中找到，文件名为：`S3://bucket_name/<queryid>_<UUID>_manifest.json`。清单文件将包含结果文件夹中文件的 URL、相应文件的记录数和大小，以及查询元数据（即该查询导出至 S3 的总字节数和总行数）。

```
{
  "result_files": [
    {
        "url":"s3://my_timestream_unloads/ec2_metrics/AEDAGANLHLBH4OLISD3CVOZZRWPX5GV2XCXRBKCVD554N6GWPWWXBP7LSG74V2Q_1448466917_szCL4YgVYzGXj2lS.gz", 
        "file_metadata": 
            { 
                "content_length_in_bytes": 32295, 
                "row_count": 10 
            }
    },
    {
        "url":"s3://my_timestream_unloads/ec2_metrics/AEDAGANLHLBH4OLISD3CVOZZRWPX5GV2XCXRBKCVD554N6GWPWWXBP7LSG74V2Q_1448466917_szCL4YgVYzGXj2lS.gz", 
        "file_metadata": 
            { 
                "content_length_in_bytes": 62295, 
                "row_count": 20 
            }
    },
  ],
  "query_metadata": 
    {
      "content_length_in_bytes": 94590, 
      "total_row_count": 30,
      "result_format": "CSV",
      "result_version": "Amazon Timestream version 1.0.0"  
    },
  "author": {
        "name": "Amazon Timestream", 
        "manifest_file_version": "1.0" 
  }
}
```

### 元数据
<a name="export-unload-common-questions-what-information-metadata"></a>

元数据文件提供有关数据集的其他信息，例如列名、列类型及架构。元数据文件位于提供的 S3 存储桶中，文件名为：S3://bucket\$1name/<queryid>\$1<UUID>\$1metadata.json 

以下是元数据文件的示例。

```
{
    "ColumnInfo": [
        {
            "Name": "hostname",
            "Type": {
                "ScalarType": "VARCHAR"
            }
        },
        {
            "Name": "region",
            "Type": {
                "ScalarType": "VARCHAR"
            }
        },
        {
            "Name": "measure_name",
            "Type": {
                "ScalarType": "VARCHAR"
            }
        },
        {
            "Name": "cpu_utilization",
            "Type": {
                "TimeSeriesMeasureValueColumnInfo": {
                    "Type": {
                        "ScalarType": "DOUBLE"
                    }
                }
            }
        }
  ],
  "Author": {
        "Name": "Amazon Timestream", 
        "MetadataFileVersion": "1.0" 
  }
}
```

元数据文件中共享的列信息与查询 API 响应中针对 `SELECT` 查询发送的 `ColumnInfo` 具有相同结构。

## 使用 Glue 爬网程序构建 Glue 数据目录
<a name="export-unload-example-using-glue-crawlers"></a>

1. 使用管理员凭证登录您的账户，以进行后续验证。

1. 使用[此处](https://docs.aws.amazon.com/glue/latest/ug/tutorial-add-crawler.html)提供的指南，为 Glue 数据库创建爬网程序。请注意，要在数据源中提供的 S3 文件夹应为 `UNLOAD` 结果文件夹，例如 `s3://my_timestream_unloads/results`。

1. 按照[此处](https://docs.aws.amazon.com/glue/latest/ug/tutorial-add-crawler.html#tutorial-add-crawler-step2)的指南运行爬网程序。

1. 查看 Glue 表。
   + 转到 **AWS Glue** → **表**。
   + 创建爬网程序时，您将看到使用表前缀创建的新表。
   + 您可以通过点击表详情视图查看架构和分区信息。

以下是使用 AWS Glue 数据目录的其他 AWS 服务和开源项目。
+ **Amazon Athena**：有关更多信息，请参阅《Amazon Athena 用户指南》中的[了解表、数据库和数据目录](https://docs.aws.amazon.com/athena/latest/ug/understanding-tables-databases-and-the-data-catalog.html)。
+ **Amazon Redshift Spectrum**：有关更多信息，请参阅《Amazon Redshift 数据库开发人员指南》中的[使用 Amazon Redshift Spectrum 查询外部数据](https://docs.aws.amazon.com/redshift/latest/dg/c-using-spectrum.html)。
+ **亚马逊 EMR** — 有关更多信息，请参阅《亚马逊 EMR 管理指南》中的 “[使用基于资源的策略，让 Amazon EMR 访问 Glue 数据目录”](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-iam-roles-glue.html)。 AWS 
+ **AWS 适用于 Apache Hive 元数据仓的 Glue 数据目录客户端 — 有关此 GitHub项目的更多信息，请参阅 Apache Hive Metastor** [e 的AWS Glue 数据目录客户端](https://github.com/awslabs/aws-glue-data-catalog-client-for-apache-hive-metastore)。

# 从 Timestream 卸载的限制 LiveAnalytics
<a name="export-unload-limits"></a>

以下是与 `UNLOAD` 命令相关的限制。
+ 使用 `UNLOAD` 语句的查询并发度为每秒 1 次查询（QPS）。超过查询速率可能会导致节流。
+ 包含 `UNLOAD` 语句的查询每次查询最多可导出 100 个分区。我们建议在使用所选列对导出数据进行分区前，先检查该列的不同计数。
+ 包含 `UNLOAD` 语句的查询将在 60 分钟后超时。
+ `UNLOAD` 语句在 Amazon S3 中创建的最大文件大小为 78GB。

有关 Timestream 的其他限制 LiveAnalytics，请参阅 [限额默认限额](ts-limits.md)