

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

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

# SQL 支持
<a name="supported-sql-constructs"></a>

Timestream fo LiveAnalytics r 支持一些常见的 SQL 结构。可在下方阅读更多内容。

**Topics**
+ [SELECT](supported-sql-constructs.SELECT.md)
+ [子查询支持](supported-sql-constructs.subquery-support.md)
+ [SHOW 语句](supported-sql-constructs.SHOW.md)
+ [DESCRIBE 语句](supported-sql-constructs.DESCRIBE.md)
+ [UNLOAD](supported-sql-constructs.UNLOAD.md)

# SELECT
<a name="supported-sql-constructs.SELECT"></a>

**SELECT** 语句可用于从一个或多个表中检索数据。Timestream 的查询语言支持以下 **SELECT** 语句的语法：

```
[ WITH with_query [, ...] ]
            SELECT [ ALL | DISTINCT ] select_expr [, ...]
            [ function (expression) OVER (
            [ PARTITION BY partition_expr_list ]
            [ ORDER BY order_list ]
            [ frame_clause ] )
            [ FROM from_item [, ...] ]
            [ WHERE condition ]
            [ GROUP BY [ ALL | DISTINCT ] grouping_element [, ...] ]
            [ HAVING condition]
            [ { UNION | INTERSECT | EXCEPT } [ ALL | DISTINCT ] select ]
            [ ORDER BY order_list ]
            [ LIMIT [ count | ALL ] ]
```

where 
+ `function (expression)` 是支持的[窗口函数](window-functions.md)之一。
+ `partition_expr_list` 为：

  ```
  expression | column_name [, expr_list ]
  ```
+ `order_list` 为：

  ```
  expression | column_name [ ASC | DESC ] 
  [ NULLS FIRST | NULLS LAST ]
  [, order_list ]
  ```
+ `frame_clause` 为：

  ```
  ROWS | RANGE
  { UNBOUNDED PRECEDING | expression PRECEDING | CURRENT ROW } |
  {BETWEEN
  { UNBOUNDED PRECEDING | expression { PRECEDING | FOLLOWING } |
  CURRENT ROW}
  AND
  { UNBOUNDED FOLLOWING | expression { PRECEDING | FOLLOWING } |
  CURRENT ROW }}
  ```
+ `from_item` 为以下之一：

  ```
  table_name [ [ AS ] alias [ ( column_alias [, ...] ) ] ]
  from_item join_type from_item [ ON join_condition | USING ( join_column [, ...] ) ]
  ```
+ `join_type` 为以下之一：

  ```
  [ INNER ] JOIN
  LEFT [ OUTER ] JOIN
  RIGHT [ OUTER ] JOIN
  FULL [ OUTER ] JOIN
  ```
+ `grouping_element` 为以下之一：

  ```
  ()
  expression
  ```

# 子查询支持
<a name="supported-sql-constructs.subquery-support"></a>

 Timestream 支持 `EXISTS` 中的子查询和 `IN` 谓词。`EXISTS` 谓词用于判断子查询是否返回任何行。`IN` 谓词用于判断子查询生成的值是否与 IN 子句中的值或表达式匹配。Timestream 查询语言支持相关子查询及其他子查询。

```
SELECT t.c1
FROM (VALUES 1, 2, 3, 4, 5) AS t(c1)
WHERE EXISTS
(SELECT t.c2
 FROM (VALUES 1, 2, 3) AS t(c2)
 WHERE t.c1= t.c2
)
ORDER BY t.c1
```


| c1 | 
| --- | 
|  1  | 
|  2  | 
|  3  | 

```
SELECT t.c1
FROM (VALUES 1, 2, 3, 4, 5) AS t(c1)
WHERE t.c1 IN
(SELECT t.c2
 FROM (VALUES 2, 3, 4) AS t(c2)
)
ORDER BY t.c1
```


| c1 | 
| --- | 
|  2  | 
|  3  | 
|  4  | 

# SHOW 语句
<a name="supported-sql-constructs.SHOW"></a>

您可以使用 `SHOW DATABASES` 语句查看账户中的所有数据库。语法如下：

```
SHOW DATABASES [LIKE pattern]
```

其中，`LIKE` 子句可用于筛选数据库名称。

您可以使用 `SHOW TABLES` 语句查看账户中的所有表。语法如下：

```
SHOW TABLES [FROM database] [LIKE pattern]
```

其中，`FROM` 子句可用于筛选数据库名称，而 `LIKE` 子句可用于筛选表名。

您可以使用 `SHOW MEASURES` 语句查看表的所有度量。语法如下：

```
SHOW MEASURES FROM database.table [LIKE pattern]
```

其中，`FROM` 子句将用于指定数据库名称和表名称，而 `LIKE` 子句可用于筛选度量名称。

# DESCRIBE 语句
<a name="supported-sql-constructs.DESCRIBE"></a>

您可以使用 `DESCRIBE` 语句查看表的元数据。语法如下：

```
DESCRIBE database.table
```

其中，`table` 包含表名称。该 describe 语句返回表的列名和数据类型。

# UNLOAD
<a name="supported-sql-constructs.UNLOAD"></a>

Timestream for LiveAnalytics 支持将`UNLOAD`命令作为其 SQL 支持的扩展。[支持的数据类型](supported-data-types.md) 中描述 `UNLOAD` 支持的数据类型。`time` 和 `unknown` 类型不适用于 `UNLOAD`。

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

其中选项为

```
{ 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>'
}
```

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/supported-sql-constructs.UNLOAD.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。  
写入文件时，实际文件大小是近似值，因此实际最大大小可能不完全等于您指定的数字。