Amazon Timestream for LiveAnalytics와 유사한 기능을 원하는 경우 Amazon Timestream for InfluxDB를 고려해 보세요. 간소화된 데이터 수집과 실시간 분석을 위한 10밀리초 미만의 쿼리 응답 시간을 제공합니다. 여기에서 자세히 알아보세요.
기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
예약된 쿼리에 대한 데이터 모델 매핑
Timestream for LiveAnalytics는 테이블의 유연한 데이터 모델링을 지원하며,이 동일한 유연성은 다른 Timestream for LiveAnalytics 테이블로 구체화된 예약된 쿼리의 결과에 적용됩니다. 예약된 쿼리를 사용하면 다중 측정 레코드 또는 단일 측정 레코드에 데이터가 있는지 여부에 관계없이 모든 테이블을 쿼리하고 다중 측정 또는 단일 측정 레코드를 사용하여 쿼리 결과를 쓸 수 있습니다.
예약된 쿼리의 사양에서 TargetConfiguration을 사용하여 쿼리 결과를 대상 파생 테이블의 적절한 열에 매핑합니다. 다음 섹션에서는 파생 테이블에서 다양한 데이터 모델을 달성하기 위해 이 TargetConfiguration을 지정하는 다양한 방법을 설명합니다. 구체적으로 다음을 확인할 수 있습니다.
-
쿼리 결과에 측정 이름이 없고 TargetConfiguration에서 대상 측정 이름을 지정하는 경우 다중 측정 레코드에 쓰는 방법입니다.
-
쿼리 결과에서 측정 이름을 사용하여 다중 측정 레코드를 작성하는 방법.
-
모델을 정의하여 다양한 다중 측정 속성으로 여러 레코드를 작성하는 방법.
-
파생 테이블의 단일 측정 레코드에 쓸 모델을 정의하는 방법.
-
예약된 쿼리에서 단일 측정 레코드 및/또는 다중 측정 레코드를 쿼리하고 결과를 단일 측정 레코드 또는 다중 측정 레코드로 구체화하여 데이터 모델의 유연성을 선택할 수 있는 방법입니다.
예제: 다중 측정 레코드의 대상 측정 이름
이 예제에서는 쿼리가 다중 측정 데이터가 있는 테이블에서 데이터를 읽고 다중 측정 레코드를 사용하여 결과를 다른 테이블에 쓰는 것을 볼 수 있습니다. 예약된 쿼리 결과에는 자연 측정 이름 열이 없습니다. 여기서 TargetConfiguration.TimestreamConfiguration의 TargetMultiMeasureName 속성을 사용하여 파생 테이블에서 측정 이름을 지정합니다. TargetConfiguration.TimestreamConfiguration.
{ "Name" : "CustomMultiMeasureName", "QueryString" : "SELECT region, bin(time, 1h) as hour, AVG(memory_cached) as avg_mem_cached_1h, MIN(memory_free) as min_mem_free_1h, MAX(memory_used) as max_mem_used_1h, SUM(disk_io_writes) as sum_1h, AVG(disk_used) as avg_disk_used_1h, AVG(disk_free) as avg_disk_free_1h, MAX(cpu_user) as max_cpu_user_1h, MIN(cpu_idle) as min_cpu_idle_1h, MAX(cpu_system) as max_cpu_system_1h FROM raw_data.devops_multi WHERE time BETWEEN bin(@scheduled_runtime, 1h) - 14h AND bin(@scheduled_runtime, 1h) - 2h AND measure_name = 'metrics' GROUP BY region, bin(time, 1h)", "ScheduleConfiguration" : { "ScheduleExpression" : "cron(0 0/1 * * ? *)" }, "NotificationConfiguration" : { "SnsConfiguration" : { "TopicArn" : "******" } }, "ScheduledQueryExecutionRoleArn": "******", "TargetConfiguration": { "TimestreamConfiguration": { "DatabaseName" : "derived", "TableName" : "dashboard_metrics_1h_agg_1", "TimeColumn" : "hour", "DimensionMappings" : [ { "Name": "region", "DimensionValueType" : "VARCHAR" } ], "MultiMeasureMappings" : { "TargetMultiMeasureName": "dashboard-metrics", "MultiMeasureAttributeMappings" : [ { "SourceColumn" : "avg_mem_cached_1h", "MeasureValueType" : "DOUBLE", "TargetMultiMeasureAttributeName" : "avgMemCached" }, { "SourceColumn" : "min_mem_free_1h", "MeasureValueType" : "DOUBLE" }, { "SourceColumn" : "max_mem_used_1h", "MeasureValueType" : "DOUBLE" }, { "SourceColumn" : "sum_1h", "MeasureValueType" : "DOUBLE", "TargetMultiMeasureAttributeName" : "totalDiskWrites" }, { "SourceColumn" : "avg_disk_used_1h", "MeasureValueType" : "DOUBLE" }, { "SourceColumn" : "avg_disk_free_1h", "MeasureValueType" : "DOUBLE" }, { "SourceColumn" : "max_cpu_user_1h", "MeasureValueType" : "DOUBLE", "TargetMultiMeasureAttributeName" : "CpuUserP100" }, { "SourceColumn" : "min_cpu_idle_1h", "MeasureValueType" : "DOUBLE" }, { "SourceColumn" : "max_cpu_system_1h", "MeasureValueType" : "DOUBLE", "TargetMultiMeasureAttributeName" : "CpuSystemP100" } ] } } }, "ErrorReportConfiguration": { "S3Configuration" : { "BucketName" : "******", "ObjectKeyPrefix": "errors", "EncryptionOption": "SSE_S3" } } }
이 예제의 매핑은 측정 이름이 dashboard-metrics이고, 속성 이름이 avgMemCached, min_mem_free_1h, max_mem_used_1h, totalDiskWrites, avg_disk_used_1h, avg_disk_free_1h, CpuUserP100, min_cpu_idle_1h, CpuSystemP100인 하나의 다중 측정 레코드를 생성합니다. TargetMultiMeasureAttributeName을 선택적으로 사용하여 쿼리 출력 열의 이름을 결과 구체화에 사용되는 다른 속성 이름으로 바꿉니다.
다음은 이 예약된 쿼리가 구체화되면 대상 테이블의 스키마입니다. 다음 결과의 Timestream for LiveAnalytics 속성 유형에서 볼 수 있듯이, 결과는 측정 스키마에 표시된 것처럼 단일 측정 이름 dashboard-metrics를 가진 다중 측정 레코드로 구체화됩니다.
| 열 | 유형 | Timestream for LiveAnalytics 속성 유형 |
|---|---|---|
|
리전 |
varchar |
DIMENSION |
|
measure_name |
varchar |
MEASURE_NAME |
|
시간 |
타임스탬프 |
TIMESTAMP |
|
CpuSystemP100 |
double |
MULTI |
|
avgMemCached |
double |
MULTI |
|
min_cpu_idle_1h |
double |
MULTI |
|
avg_disk_free_1h |
double |
MULTI |
|
avg_disk_used_1h |
double |
MULTI |
|
totalDiskWrites |
double |
MULTI |
|
max_mem_used_1h |
double |
MULTI |
|
min_mem_free_1h |
double |
MULTI |
|
CpuUserP100 |
double |
MULTI |
다음은 SHOW MEAURES 쿼리로 얻은 해당 측정입니다.
| measure_name | data_type | 차원 |
|---|---|---|
|
dashboard-metrics |
다중 |
[{'dimension_name': 'region', 'data_type': 'varchar'}] |
예제: 다중 측정 레코드에서 예약된 쿼리의 측정 이름 사용
이 예제에서는 단일 측정 레코드가 있는 테이블에서 쿼리를 읽고 결과를 다중 측정 레코드로 구체화하는 것을 볼 수 있습니다. 이 경우 예약된 쿼리 결과에는 예약된 쿼리의 결과가 구체화된 대상 테이블에서 값을 측정 이름으로 사용할 수 있는 열이 있습니다. 그런 다음 TargetConfiguration.TimestreamConfiguration의 MeasureNameColumn 속성을 사용하여 파생 테이블의 다중 측정 레코드에 대한 측정 이름을 지정할 수 있습니다.
{ "Name" : "UsingMeasureNameFromQueryResult", "QueryString" : "SELECT region, bin(time, 1h) as hour, measure_name, AVG(CASE WHEN measure_name IN ('memory_cached', 'disk_used', 'disk_free') THEN measure_value::double ELSE NULL END) as avg_1h, MIN(CASE WHEN measure_name IN ('memory_free', 'cpu_idle') THEN measure_value::double ELSE NULL END) as min_1h, SUM(CASE WHEN measure_name IN ('disk_io_writes') THEN measure_value::double ELSE NULL END) as sum_1h, MAX(CASE WHEN measure_name IN ('memory_used', 'cpu_user', 'cpu_system') THEN measure_value::double ELSE NULL END) as max_1h FROM raw_data.devops WHERE time BETWEEN bin(@scheduled_runtime, 1h) - 14h AND bin(@scheduled_runtime, 1h) - 2h AND measure_name IN ('memory_free', 'memory_used', 'memory_cached', 'disk_io_writes', 'disk_used', 'disk_free', 'cpu_user', 'cpu_system', 'cpu_idle') GROUP BY region, measure_name, bin(time, 1h)", "ScheduleConfiguration" : { "ScheduleExpression" : "cron(0 0/1 * * ? *)" }, "NotificationConfiguration" : { "SnsConfiguration" : { "TopicArn" : "******" } }, "ScheduledQueryExecutionRoleArn": "******", "TargetConfiguration": { "TimestreamConfiguration": { "DatabaseName" : "derived", "TableName" : "dashboard_metrics_1h_agg_2", "TimeColumn" : "hour", "DimensionMappings" : [ { "Name": "region", "DimensionValueType" : "VARCHAR" } ], "MeasureNameColumn" : "measure_name", "MultiMeasureMappings" : { "MultiMeasureAttributeMappings" : [ { "SourceColumn" : "avg_1h", "MeasureValueType" : "DOUBLE" }, { "SourceColumn" : "min_1h", "MeasureValueType" : "DOUBLE", "TargetMultiMeasureAttributeName": "p0_1h" }, { "SourceColumn" : "sum_1h", "MeasureValueType" : "DOUBLE" }, { "SourceColumn" : "max_1h", "MeasureValueType" : "DOUBLE", "TargetMultiMeasureAttributeName": "p100_1h" } ] } } }, "ErrorReportConfiguration": { "S3Configuration" : { "BucketName" : "******", "ObjectKeyPrefix": "errors", "EncryptionOption": "SSE_S3" } } }
이 예제의 매핑은 속성 avg_1h, p0_1h, sum_1h, p100_1h를 가진 다중 측정 레코드를 생성하며, 대상 테이블의 다중 측정 레코드에 대한 측정 이름으로 쿼리 결과의 measure_name 열 값을 사용합니다. 또한 이전 예제에서는 선택적으로 TargetMultiMeasureAttributeName을 매핑의 하위 집합과 함께 사용하여 속성의 이름을 바꿉니다. 예를 들어, min_1h는 p0_1h로 이름이 바뀌었고, max_1h는 p100_1h로 이름이 바뀌었습니다.
다음은 이 예약된 쿼리가 실행된 후 대상 테이블의 스키마입니다. 다음 결과의 Timestream for LiveAnalytics 속성 유형에서 볼 수 있듯이, 결과는 다중 측정 레코드로 구체화됩니다. 측정 스키마를 보면 쿼리 결과에 표시된 값에 해당하는 9개의 서로 다른 측정 이름이 수집되었습니다.
| 열 | 유형 | Timestream for LiveAnalytics 속성 유형 |
|---|---|---|
|
리전 |
varchar |
DIMENSION |
|
measure_name |
varchar |
MEASURE_NAME |
|
시간 |
타임스탬프 |
TIMESTAMP |
|
sum_1h |
double |
MULTI |
|
p100_1h |
double |
MULTI |
|
p0_1h |
double |
MULTI |
|
avg_1h |
double |
MULTI |
다음은 SHOW MEAURES 쿼리에서 얻은 해당 측정입니다.
| measure_name | data_type | 차원 |
|---|---|---|
|
cpu_idle |
다중 |
[{'dimension_name': 'region', 'data_type': 'varchar'}] |
|
cpu_system |
다중 |
[{'dimension_name': 'region', 'data_type': 'varchar'}] |
|
cpu_user |
다중 |
[{'dimension_name': 'region', 'data_type': 'varchar'}] |
|
disk_free |
다중 |
[{'dimension_name': 'region', 'data_type': 'varchar'}] |
|
disk_io_writes |
다중 |
[{'dimension_name': 'region', 'data_type': 'varchar'}] |
|
disk_used |
다중 |
[{'dimension_name': 'region', 'data_type': 'varchar'}] |
|
memory_cached |
다중 |
[{'dimension_name': 'region', 'data_type': 'varchar'}] |
|
memory_free |
다중 |
[{'dimension_name': 'region', 'data_type': 'varchar'}] |
|
memory_free |
다중 |
[{'dimension_name': 'region', 'data_type': 'varchar'}] |
예제: 속성이 다른 다양한 다중 측정 레코드에 결과 매핑
다음 예제에서는 쿼리 결과의 여러 열을 측정 이름이 다른 여러 다중 측정 레코드에 매핑하는 방법을 보여줍니다. 다음과 같은 예약된 쿼리 정의가 있으면 쿼리 결과에 region, hour, avg_mem_cached_1h, min_mem_free_1h, max_mem_used_1h, total_disk_io_writes_1h, avg_disk_used_1h, avg_disk_free_1h, max_cpu_user_1h, max_cpu_system_1h, min_cpu_system_1h 열이 포함됩니다. region은 dimension에 매핑되고, hour는 time 열에 매핑됩니다.
TargetConfiguration.TimestreamConfiguration의 MixedMeasureMappings 속성은 측정값을 파생 테이블의 다중 측정 레코드에 매핑하는 방법을 지정합니다.
이 특정 예제에서 avg_mem_cached_1h, min_mem_free_1h, max_mem_used_1h는 측정 이름이 mem_aggregates인 하나의 다중 측정 레코드에 사용되고, total_disk_io_writes_1h, avg_disk_used_1h, avg_disk_free_1h는 측정 이름이 disk_aggregates인 다른 다중 측정 레코드에 사용되고, 마지막으로 max_cpu_user_1h, max_cpu_system_1h, min_cpu_system_1h는 측정 이름이 cpu_aggregates인 다른 다중 측정 레코드에 사용됩니다.
이러한 매핑에서는 선택적으로 TargetMultiMeasureAttributeName을 사용하여 대상 테이블에서 다른 속성 이름을 갖도록 쿼리 결과 열의 이름을 바꿀 수도 있습니다. 예를 들어, 결과 열 avg_mem_cached_1h는 avgMemCached로 이름이 바뀌고, total_disk_io_writes_1h는 totalIOWrites로 이름이 바뀝니다.
다중 측정 레코드에 대한 매핑을 정의할 때 Timestream for LiveAnalytics는 쿼리 결과의 모든 행을 검사하고 NULL 값이 있는 열 값을 자동으로 무시합니다. 따라서 여러 측정 이름이 있는 매핑의 경우 매핑의 해당 그룹에 대한 모든 열 값이 지정된 행에 대해 NULL이면 해당 측정 이름에 대한 값이 해당 행에 대해 수집되지 않습니다.
예를 들어 다음 매핑에서 avg_mem_cached_1h, min_mem_free_1h, max_mem_used_1h는 측정 이름 mem_aggregates에 매핑됩니다. 쿼리 결과의 특정 행에 대해 이러한 모든 열 값이 NULL인 경우 Timestream for LiveAnalytics는 해당 행에 대한 측정값 mem_aggregates를 수집하지 않습니다. 지정된 행의 9개 열이 모두 NULL이면 오류 보고서에 사용자 오류가 보고됩니다.
{ "Name" : "AggsInDifferentMultiMeasureRecords", "QueryString" : "SELECT region, bin(time, 1h) as hour, AVG(CASE WHEN measure_name = 'memory_cached' THEN measure_value::double ELSE NULL END) as avg_mem_cached_1h, MIN(CASE WHEN measure_name = 'memory_free' THEN measure_value::double ELSE NULL END) as min_mem_free_1h, MAX(CASE WHEN measure_name = 'memory_used' THEN measure_value::double ELSE NULL END) as max_mem_used_1h, SUM(CASE WHEN measure_name = 'disk_io_writes' THEN measure_value::double ELSE NULL END) as total_disk_io_writes_1h, AVG(CASE WHEN measure_name = 'disk_used' THEN measure_value::double ELSE NULL END) as avg_disk_used_1h, AVG(CASE WHEN measure_name = 'disk_free' THEN measure_value::double ELSE NULL END) as avg_disk_free_1h, MAX(CASE WHEN measure_name = 'cpu_user' THEN measure_value::double ELSE NULL END) as max_cpu_user_1h, MAX(CASE WHEN measure_name = 'cpu_system' THEN measure_value::double ELSE NULL END) as max_cpu_system_1h, MIN(CASE WHEN measure_name = 'cpu_idle' THEN measure_value::double ELSE NULL END) as min_cpu_system_1h FROM raw_data.devops WHERE time BETWEEN bin(@scheduled_runtime, 1h) - 14h AND bin(@scheduled_runtime, 1h) - 2h AND measure_name IN ('memory_cached', 'memory_free', 'memory_used', 'disk_io_writes', 'disk_used', 'disk_free', 'cpu_user', 'cpu_system', 'cpu_idle') GROUP BY region, bin(time, 1h)", "ScheduleConfiguration" : { "ScheduleExpression" : "cron(0 0/1 * * ? *)" }, "NotificationConfiguration" : { "SnsConfiguration" : { "TopicArn" : "******" } }, "ScheduledQueryExecutionRoleArn": "******", "TargetConfiguration": { "TimestreamConfiguration": { "DatabaseName" : "derived", "TableName" : "dashboard_metrics_1h_agg_3", "TimeColumn" : "hour", "DimensionMappings" : [ { "Name": "region", "DimensionValueType" : "VARCHAR" } ], "MixedMeasureMappings" : [ { "MeasureValueType" : "MULTI", "TargetMeasureName" : "mem_aggregates", "MultiMeasureAttributeMappings" : [ { "SourceColumn" : "avg_mem_cached_1h", "MeasureValueType" : "DOUBLE", "TargetMultiMeasureAttributeName": "avgMemCached" }, { "SourceColumn" : "min_mem_free_1h", "MeasureValueType" : "DOUBLE" }, { "SourceColumn" : "max_mem_used_1h", "MeasureValueType" : "DOUBLE", "TargetMultiMeasureAttributeName": "maxMemUsed" } ] }, { "MeasureValueType" : "MULTI", "TargetMeasureName" : "disk_aggregates", "MultiMeasureAttributeMappings" : [ { "SourceColumn" : "total_disk_io_writes_1h", "MeasureValueType" : "DOUBLE", "TargetMultiMeasureAttributeName": "totalIOWrites" }, { "SourceColumn" : "avg_disk_used_1h", "MeasureValueType" : "DOUBLE" }, { "SourceColumn" : "avg_disk_free_1h", "MeasureValueType" : "DOUBLE" } ] }, { "MeasureValueType" : "MULTI", "TargetMeasureName" : "cpu_aggregates", "MultiMeasureAttributeMappings" : [ { "SourceColumn" : "max_cpu_user_1h", "MeasureValueType" : "DOUBLE" }, { "SourceColumn" : "max_cpu_system_1h", "MeasureValueType" : "DOUBLE" }, { "SourceColumn" : "min_cpu_idle_1h", "MeasureValueType" : "DOUBLE", "TargetMultiMeasureAttributeName": "minCpuIdle" } ] } ] } }, "ErrorReportConfiguration": { "S3Configuration" : { "BucketName" : "******", "ObjectKeyPrefix": "errors", "EncryptionOption": "SSE_S3" } } }
다음은 이 예약된 쿼리가 구체화되면 대상 테이블의 스키마입니다.
| 열 | 유형 | Timestream for LiveAnalytics 속성 유형 |
|---|---|---|
|
리전 |
varchar |
DIMENSION |
|
measure_name |
varchar |
MEASURE_NAME |
|
시간 |
타임스탬프 |
TIMESTAMP |
|
minCpuIdle |
double |
MULTI |
|
max_cpu_system_1h |
double |
MULTI |
|
max_cpu_user_1h |
double |
MULTI |
|
avgMemCached |
double |
MULTI |
|
maxMemUsed |
double |
MULTI |
|
min_mem_free_1h |
double |
MULTI |
|
avg_disk_free_1h |
double |
MULTI |
|
avg_disk_used_1h |
double |
MULTI |
|
totalIOWrites |
double |
MULTI |
다음은 SHOW MEAURES 쿼리로 얻은 해당 측정입니다.
| measure_name | data_type | 차원 |
|---|---|---|
|
cpu_aggregates |
다중 |
[{'dimension_name': 'region', 'data_type': 'varchar'}] |
|
disk_aggregates |
다중 |
[{'dimension_name': 'region', 'data_type': 'varchar'}] |
|
mem_aggregates |
다중 |
[{'dimension_name': 'region', 'data_type': 'varchar'}] |
예제: 쿼리 결과의 측정 이름을 사용하여 결과를 단일 측정 레코드에 매핑
다음은 결과가 단일 측정 레코드로 구체화된 예약된 쿼리의 예입니다. 이 예제에서 쿼리 결과에는 measure_name 열이 포함되고, 이 열의 값은 대상 테이블에서 측정 이름으로 사용됩니다. TargetConfiguration.TimestreamConfiguration의 MixedMeasureMappings 속성을 사용하여 쿼리 결과 열을 대상 테이블의 스칼라 측정에 매핑하도록 지정합니다.
다음 예제 정의에서 쿼리 결과는 9개의 고유한 measure_name 값으로 예상됩니다. 매핑에서 이러한 모든 측정 이름을 나열하고 해당 측정 이름의 단일 측정값에 사용할 열을 지정합니다. 예를 들어, 이 매핑에서 지정된 결과 행에 대해 memory_cached의 측정 이름이 표시되면 데이터가 대상 테이블에 작성될 때 avg_1h 열의 값이 측정값으로 사용됩니다. 선택적으로 TargetMeasureName을 사용하여 이 값에 대한 새 측정 이름을 제공할 수 있습니다.
{ "Name" : "UsingMeasureNameColumnForSingleMeasureMapping", "QueryString" : "SELECT region, bin(time, 1h) as hour, measure_name, AVG(CASE WHEN measure_name IN ('memory_cached', 'disk_used', 'disk_free') THEN measure_value::double ELSE NULL END) as avg_1h, MIN(CASE WHEN measure_name IN ('memory_free', 'cpu_idle') THEN measure_value::double ELSE NULL END) as min_1h, SUM(CASE WHEN measure_name IN ('disk_io_writes') THEN measure_value::double ELSE NULL END) as sum_1h, MAX(CASE WHEN measure_name IN ('memory_used', 'cpu_user', 'cpu_system') THEN measure_value::double ELSE NULL END) as max_1h FROM raw_data.devops WHERE time BETWEEN bin(@scheduled_runtime, 1h) - 14h AND bin(@scheduled_runtime, 1h) - 2h AND measure_name IN ('memory_free', 'memory_used', 'memory_cached', 'disk_io_writes', 'disk_used', 'disk_free', 'cpu_user', 'cpu_system', 'cpu_idle') GROUP BY region, bin(time, 1h), measure_name", "ScheduleConfiguration" : { "ScheduleExpression" : "cron(0 0/1 * * ? *)" }, "NotificationConfiguration" : { "SnsConfiguration" : { "TopicArn" : "******" } }, "ScheduledQueryExecutionRoleArn": "******", "TargetConfiguration": { "TimestreamConfiguration": { "DatabaseName" : "derived", "TableName" : "dashboard_metrics_1h_agg_4", "TimeColumn" : "hour", "DimensionMappings" : [ { "Name": "region", "DimensionValueType" : "VARCHAR" } ], "MeasureNameColumn" : "measure_name", "MixedMeasureMappings" : [ { "MeasureName" : "memory_cached", "MeasureValueType" : "DOUBLE", "SourceColumn" : "avg_1h", "TargetMeasureName" : "AvgMemCached" }, { "MeasureName" : "disk_used", "MeasureValueType" : "DOUBLE", "SourceColumn" : "avg_1h" }, { "MeasureName" : "disk_free", "MeasureValueType" : "DOUBLE", "SourceColumn" : "avg_1h" }, { "MeasureName" : "memory_free", "MeasureValueType" : "DOUBLE", "SourceColumn" : "min_1h", "TargetMeasureName" : "MinMemFree" }, { "MeasureName" : "cpu_idle", "MeasureValueType" : "DOUBLE", "SourceColumn" : "min_1h" }, { "MeasureName" : "disk_io_writes", "MeasureValueType" : "DOUBLE", "SourceColumn" : "sum_1h", "TargetMeasureName" : "total-disk-io-writes" }, { "MeasureName" : "memory_used", "MeasureValueType" : "DOUBLE", "SourceColumn" : "max_1h", "TargetMeasureName" : "maxMemUsed" }, { "MeasureName" : "cpu_user", "MeasureValueType" : "DOUBLE", "SourceColumn" : "max_1h" }, { "MeasureName" : "cpu_system", "MeasureValueType" : "DOUBLE", "SourceColumn" : "max_1h" } ] } }, "ErrorReportConfiguration": { "S3Configuration" : { "BucketName" : "******", "ObjectKeyPrefix": "errors", "EncryptionOption": "SSE_S3" } } }
다음은 이 예약된 쿼리가 실행된 후 대상 테이블의 스키마입니다. 스키마에서 볼 수 있듯이 테이블은 단일 측정 레코드를 사용합니다. 테이블에 대한 측정 스키마를 나열하면 사양에 제공된 매핑을 기반으로에 작성된 9가지 측정값이 표시됩니다.
| 열 | 유형 | Timestream for LiveAnalytics 속성 유형 |
|---|---|---|
|
리전 |
varchar |
DIMENSION |
|
measure_name |
varchar |
MEASURE_NAME |
|
시간 |
타임스탬프 |
TIMESTAMP |
|
measure_value::double |
double |
MEASURE_VALUE |
다음은 SHOW MEAURES 쿼리로 얻은 해당 측정입니다.
| measure_name | data_type | 차원 |
|---|---|---|
|
AvgMemCached |
double |
[{'dimension_name': 'region', 'data_type': 'varchar'}] |
|
MinMemFree |
double |
[{'dimension_name': 'region', 'data_type': 'varchar'}] |
|
cpu_idle |
double |
[{'dimension_name': 'region', 'data_type': 'varchar'}] |
|
cpu_system |
double |
[{'dimension_name': 'region', 'data_type': 'varchar'}] |
|
cpu_user |
double |
[{'dimension_name': 'region', 'data_type': 'varchar'}] |
|
disk_free |
double |
[{'dimension_name': 'region', 'data_type': 'varchar'}] |
|
disk_used |
double |
[{'dimension_name': 'region', 'data_type': 'varchar'}] |
|
maxMemUsed |
double |
[{'dimension_name': 'region', 'data_type': 'varchar'}] |
|
total-disk-io-writes |
double |
[{'dimension_name': 'region', 'data_type': 'varchar'}] |
예제: 쿼리 결과 열을 측정 이름으로 사용하여 결과를 단일 측정 레코드에 매핑
이 예제에서는 결과에 측정 이름 열이 없는 쿼리가 있습니다. 대신 출력을 단일 측정 레코드에 매핑할 때 쿼리 결과 열 이름을 측정 이름으로 사용하려고 합니다. 이전에는 유사한 결과가 다중 측정 레코드에 작성된 예가 있었습니다. 이 예제에서는 애플리케이션 시나리오에 맞는 경우 단일 측정 레코드에 매핑하는 방법을 알아봅니다.
다시 말하지만, TargetConfiguration.TimestreamConfiguration의 MixedMeasureMappings 속성을 사용하여 이 매핑을 지정합니다. 다음 예제에서는 쿼리 결과에 9개의 열이 있는 것을 볼 수 있습니다. 결과 열을 측정 이름으로 사용하고 값을 단일 측정값으로 사용합니다.
예를 들어, 쿼리 결과의 지정된 행에 대해 열 이름 avg_mem_cached_1h가 열과 연결된 열 이름과 값으로 사용되고, avg_mem_cached_1h가 단일 측정 레코드의 측정값으로 사용됩니다. TargetMeasureName을 사용하여 대상 테이블에서 다른 측정 이름을 사용할 수도 있습니다. 예를 들어, 열 sum_1h의 값에 대해 매핑은 대상 테이블에서 측정 이름으로 total_disk_io_writes_1h를 사용하도록 지정합니다. 열의 값이 NULL이면 해당 측정값은 무시됩니다.
{ "Name" : "SingleMeasureMappingWithoutMeasureNameColumnInQueryResult", "QueryString" : "SELECT region, bin(time, 1h) as hour, AVG(CASE WHEN measure_name = 'memory_cached' THEN measure_value::double ELSE NULL END) as avg_mem_cached_1h, AVG(CASE WHEN measure_name = 'disk_used' THEN measure_value::double ELSE NULL END) as avg_disk_used_1h, AVG(CASE WHEN measure_name = 'disk_free' THEN measure_value::double ELSE NULL END) as avg_disk_free_1h, MIN(CASE WHEN measure_name = 'memory_free' THEN measure_value::double ELSE NULL END) as min_mem_free_1h, MIN(CASE WHEN measure_name = 'cpu_idle' THEN measure_value::double ELSE NULL END) as min_cpu_idle_1h, SUM(CASE WHEN measure_name = 'disk_io_writes' THEN measure_value::double ELSE NULL END) as sum_1h, MAX(CASE WHEN measure_name = 'memory_used' THEN measure_value::double ELSE NULL END) as max_mem_used_1h, MAX(CASE WHEN measure_name = 'cpu_user' THEN measure_value::double ELSE NULL END) as max_cpu_user_1h, MAX(CASE WHEN measure_name = 'cpu_system' THEN measure_value::double ELSE NULL END) as max_cpu_system_1h FROM raw_data.devops WHERE time BETWEEN bin(@scheduled_runtime, 1h) - 14h AND bin(@scheduled_runtime, 1h) - 2h AND measure_name IN ('memory_free', 'memory_used', 'memory_cached', 'disk_io_writes', 'disk_used', 'disk_free', 'cpu_user', 'cpu_system', 'cpu_idle') GROUP BY region, bin(time, 1h)", "ScheduleConfiguration" : { "ScheduleExpression" : "cron(0 0/1 * * ? *)" }, "NotificationConfiguration" : { "SnsConfiguration" : { "TopicArn" : "******" } }, "ScheduledQueryExecutionRoleArn": "******", "TargetConfiguration": { "TimestreamConfiguration": { "DatabaseName" : "derived", "TableName" : "dashboard_metrics_1h_agg_5", "TimeColumn" : "hour", "DimensionMappings" : [ { "Name": "region", "DimensionValueType" : "VARCHAR" } ], "MixedMeasureMappings" : [ { "MeasureValueType" : "DOUBLE", "SourceColumn" : "avg_mem_cached_1h" }, { "MeasureValueType" : "DOUBLE", "SourceColumn" : "avg_disk_used_1h" }, { "MeasureValueType" : "DOUBLE", "SourceColumn" : "avg_disk_free_1h" }, { "MeasureValueType" : "DOUBLE", "SourceColumn" : "min_mem_free_1h" }, { "MeasureValueType" : "DOUBLE", "SourceColumn" : "min_cpu_idle_1h" }, { "MeasureValueType" : "DOUBLE", "SourceColumn" : "sum_1h", "TargetMeasureName" : "total_disk_io_writes_1h" }, { "MeasureValueType" : "DOUBLE", "SourceColumn" : "max_mem_used_1h" }, { "MeasureValueType" : "DOUBLE", "SourceColumn" : "max_cpu_user_1h" }, { "MeasureValueType" : "DOUBLE", "SourceColumn" : "max_cpu_system_1h" } ] } }, "ErrorReportConfiguration": { "S3Configuration" : { "BucketName" : "******", "ObjectKeyPrefix": "errors", "EncryptionOption": "SSE_S3" } } }
다음은 이 예약된 쿼리가 실행된 후 대상 테이블의 스키마입니다. 대상 테이블이 double 유형의 단일 측정값이 포함된 레코드를 저장하는 것을 볼 수 있습니다. 마찬가지로 테이블의 측정 스키마에는 9개의 측정 이름이 표시됩니다. 매핑에서 sum_1h의 이름이 total_disk_io_writes_1h로 바뀌었기 때문에 측정 이름 total_disk_io_writes_1h가 존재한다는 점에도 유의하세요.
| 열 | 유형 | Timestream for LiveAnalytics 속성 유형 |
|---|---|---|
|
리전 |
varchar |
DIMENSION |
|
measure_name |
varchar |
MEASURE_NAME |
|
시간 |
타임스탬프 |
TIMESTAMP |
|
measure_value::double |
double |
MEASURE_VALUE |
다음은 SHOW MEAURES 쿼리로 얻은 해당 측정입니다.
| measure_name | data_type | 차원 |
|---|---|---|
|
avg_disk_free_1h |
double |
[{'dimension_name': 'region', 'data_type': 'varchar'}] |
|
avg_disk_used_1h |
double |
[{'dimension_name': 'region', 'data_type': 'varchar'}] |
|
avg_mem_cached_1h |
double |
[{'dimension_name': 'region', 'data_type': 'varchar'}] |
|
max_cpu_system_1h |
double |
[{'dimension_name': 'region', 'data_type': 'varchar'}] |
|
max_cpu_user_1h |
double |
[{'dimension_name': 'region', 'data_type': 'varchar'}] |
|
max_mem_used_1h |
double |
[{'dimension_name': 'region', 'data_type': 'varchar'}] |
|
min_cpu_idle_1h |
double |
[{'dimension_name': 'region', 'data_type': 'varchar'}] |
|
min_mem_free_1h |
double |
[{'dimension_name': 'region', 'data_type': 'varchar'}] |
|
total-disk-io-writes |
double |
[{'dimension_name': 'region', 'data_type': 'varchar'}] |