本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
卸载概念
语法
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>' | }
参数
- 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 's3://bucket-name/folder'
或
TO 's3://access-point-alias/folder'
语
TO
句中的子UNLOAD
句指定查询结果输出的目的地。您需要提供完整路径,包括 Amazon S3 存储桶名称或 Amazon S3,以及在 Amazon S3 access-point-alias 上 LiveAnalytics写入输出文件对象的 Timestream 上的文件夹位置。S3 存储桶应归同一账户所有,且位于同一区域。除了查询结果集之外,Timestream 还会将清单和元数据文件 LiveAnalytics 写入指定的目标文件夹。 - PARTITIONED_BY 子句
-
partitioned_by = ARRAY [col_name[,…] , (default: none)
该
partitioned_by
子句用于查询中,用于对数据进行精细分组和分析。将查询结果导出到 S3 存储桶时,您可以选择根据选择查询中的一列或多列对数据进行分区。对数据进行分区时,根据分区列将导出的数据分成子集,每个子集存储在单独的文件夹中。在包含导出数据的结果文件夹中,将自动创建一个folder/results/partition column = partition value/
子文件夹。但是,请注意,分区列不包含在输出文件中。partitioned_by
不是语法中的必备子句。如果您选择在不进行任何分区的情况下导出数据,则可以在语法中排除该子句。假设您正在监控网站的点击流数据,并且有 5 个流量渠道
direct
,即Social Media
、Organic Search
Other
、和Referral
。导出数据时,您可以选择使用列对数据进行分区Channel
。在您的数据文件夹中s3://bucketname/results
,您将有五个文件夹,每个文件夹都有各自的频道名称,例如,s3://bucketname/results/channel=Social Media/.
在此文件夹中,您将找到通过该Social Media
渠道登陆您网站的所有客户的数据。同样,剩下的频道还有其他文件夹。按频道列分区的导出数据
- FORMAT
-
format = [ '{ CSV | PARQUET }' , default: CSV
用于指定写入 S3 存储桶的查询结果格式的关键字。您可以使用逗号 (,) 作为默认分隔符将数据导出为逗号分隔值 (CSV),也可以以 Apache Parquet 格式(一种用于分析的高效开放列式存储格式)导出。
- 压缩
-
compression = [ '{ GZIP | NONE }' ], default: GZIP
您可以使用压缩算法 GZIP 压缩导出的数据,也可以通过指定选项将其解压缩。
NONE
- ENCRYPTION
-
encryption = [ '{ SSE_KMS | SSE_S3 }' ], default: SSE_S3
Amazon S3 上的输出文件使用您选择的加密选项进行加密。除了您的数据外,还会根据您选择的加密选项对清单文件和元数据文件进行加密。我们目前支持 SSE_S3 和 SSE_KMS 加密。SSE_S3 是一种服务器端加密,Amazon S3 使用 256 位高级加密标准 (AES) 加密对数据进行加密。SSE_KMS 是一种服务器端加密,用于使用客户管理的密钥对数据进行加密。
- KMS_KEY
-
kms_key = '<string>'
KMS 密钥是客户定义的密钥,用于加密导出的查询结果。KMS 密钥由 AWS 密钥管理服务 (AWS KMS) 安全管理,用于加密 Amazon S3 上的数据文件。
- 字段分隔符
-
field_delimiter ='<character>' , default: (,)
以 CSV 格式导出数据时,此字段指定一个 ASCII 字符用于分隔输出文件中的字段,例如竖线字符 (|)、逗号 (,) 或制表符 (/t)。CSV 文件的默认分隔符是逗号字符。如果数据中的值包含选定的分隔符,则分隔符将用引号字符引用。例如,如果您的数据中的值包含
Time,stream
,则该值将像在导出数据"Time,stream"
中一样被引用。Timestream 使用的引号字符 LiveAnalytics 是双引号 (“)。FIELD_DELIMITER
如果要在 CSV 中包含标题,请避免将回车符(ASCII 130D
、十六进制、文本 '\ r')或换行符(ASCII 10、十六进制 0A、文本'\ n ')指定为,因为这将使许多解析器无法在生成的 CSV 输出中正确解析标题。 - 逃脱了_BY
-
escaped_by = '<character>', default: (\)
以 CSV 格式导出数据时,此字段指定写入 S3 存储桶的数据文件中应被视为转义字符的字符。逃跑发生在以下场景中:
-
如果值本身包含引号字符 (“),则将使用转义字符对其进行转义。例如,如果值为
Time"stream
,其中 (\) 是配置的转义字符,则将其转义为Time\"stream
。 -
如果该值包含配置的转义字符,则会对其进行转义。例如,如果值为
Time\stream
,则将其转义为Time\\stream
。
注意
如果导出的输出包含诸如数组、行或时间序列之类的复杂数据类型,则会将其序列化为 JSON 字符串。以下为示例。
数据类型 实际价值 如何以 CSV 格式对值进行转义 [序列化的 JSON 字符串] 数组
[ 23,24,25 ]
"[23,24,25]"
行
( x=23.0, y=hello )
"{\"x\":23.0,\"y\":\"hello\"}"
时间序列
[ ( time=1970-01-01 00:00:00.000000010, value=100.0 ),( time=1970-01-01 00:00:00.000000012, value=120.0 ) ]
"[{\"time\":\"1970-01-01 00:00:00.000000010Z\",\"value\":100.0},{\"time\":\"1970-01-01 00:00:00.000000012Z\",\"value\":120.0}]"
-
- 包含标题
-
include_header = 'true' , default: 'false'
以 CSV 格式导出数据时,此字段允许您将列名作为导出的 CSV 数据文件的第一行。
可接受的值为 “真” 和 “假”,默认值为 “假”。诸如
escaped_by
和之类的文本转换选项也field_delimiter
适用于标题。注意
包括标题时,请务必不要选择回车符(ASCII 13、十六进制 0D、文本 '\ r')或换行符(ASCII 10、十六进制 0A、文本'\ n ')作为标题
FIELD_DELIMITER
,因为这将使许多解析器无法在生成的 CSV 输出中正确解析标题。 - 最大文件大小
-
max_file_size = 'X[MB|GB]' , default: '78GB'
此字段指定该
UNLOAD
语句在 Amazon S3 中创建的最大文件大小。该UNLOAD
语句可以创建多个文件,但是写入 Amazon S3 的每个文件的最大大小将接近该字段中指定的大小。该字段的值必须介于 16 MB 到 78 GB 之间(含)。你可以用整数(例如)或小数(如
0.5GB
或24.7MB
)来指定。12GB
默认值为 78 GB。实际文件大小是写入文件时的近似值,因此实际最大大小可能不完全等于您指定的数字。
写入我的 S3 存储桶的是什么?
对于每个成功执行的 UNLOAD 查询,Timestream 都会将您的查询结果、元数据文件和清单文件 LiveAnalytics 写入 S3 存储桶。如果您已对数据进行分区,则结果文件夹中包含所有分区文件夹。清单文件包含由 UNLOAD 命令写入的文件列表。元数据文件包含描述写入数据的特征、属性和属性的信息。
导出的文件名是什么?
导出的文件名包含两个部分,第一个组成部分是 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
实木复合文件
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 扩展名。
每个文件包含什么信息?
清单文件
清单文件提供有关执行 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" } }
元数据
元数据文件提供有关数据集的其他信息,例如列名、列类型和架构。<queryid><UUID>元数据文件可在提供的 S3 存储桶中找到,文件名为:S3: //bucket_name/ _ _metadata.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 响应中ColumnInfo
发送的SELECT
查询信息结构相同。
结果
结果文件夹包含您以 Apache Parquet 或 CSV 格式导出的数据。
示例
当你通过UNLOAD
查询 API 提交如下查询时,
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 行 * 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 } }
数据类型
该UNLOAD
语句支持支持的数据类型除和之外所述 LiveAnalytics的 Timestream 查询语言的所有数据类型time
。unknown