# dataset

## dataset relation diagram

![Dataset ERD Diagram](./assets/images/dataset-diagram.jpg)

- data_sets 하나가 여러 data_items 를 갖습니다. data_sets와 data_items 조합으로 CCP 항목들을 정의합니다.
- data*sets는 또한 data_key_sets를 참고할 수 있습니다. data_key_sets에서는 data_samples, data_oocs의 조회 인덱스를 위한 key(key_01~key_05)를 정의합니다. data_samples, data_oocs 데이타 생성 시점에, data 컬럼 값으로 부터 별도 컬럼(key*##)에 해당 값을 저장합니다.
- data_set_histories에는 data_sets의 변경 내역이 추가됩니다. data_sets의 id는 data_set_histories에 original_id로 추가됩니다. data_set_histories를 사용하려면 original_id 와 version이 필요합니다.
- data_sensors에는 자동 수집되는 디바이스 정보를 정의합니다. data_sets를 참고하여 CCP를 관리하도록 합니다.
- data_samples에는 입력받은 실제 데이터가 저장됩니다.
- data_oocs에는 data_sets의 CCP 스펙을 벗어나는 경우, data_samples의 데이터를 복사하여 추가됩니다.
- data_archives에는 다운로드 받기 위한 요청 정보 및 상태가 저장됩니다.

## Architecture for collecting data samples

![Architecture for data-samples](./assets/images/data-samples.jpg)
data_samples, data_oocs, data_set_histories의 테이블 변경 사항은 Database CDC로 Kafka에 전송 및 저장되고 토픽별로 다음의 lambda 들이 트리거되어 S3로 저장합니다. 이 S3 데이터는 Glue Crawler, Glue Data Catalog를 거쳐 Athena에서 조회할 수 있습니다. hive 스타일의 S3 파티션 정보들을 업데이트 하는 작업이 스케줄링되어 작동하고, 파티션 정보가 업데이트 된 S3파일들이 Athena에서 조회되므로 실시간으로 데이터가 반영되지는 않습니다.

- [func-data-samples-to-s3](https://github.com/operatochef/serverless/tree/main/func-data-samples-to-s3)
- [func-data-oocs-to-s3](https://github.com/operatochef/serverless/tree/main/func-data-oocs-to-s3)
- [func-data-set-histories-to-s3](https://github.com/operatochef/serverless/tree/main/func-data-set-histories-to-s3)

개발용으로는 reference-app을 사용하고 있으며, 여기서는 func-dev-\* 로 시작하는 lambda들을 사용합니다.

## data-report process

![data-report process](./assets/images/data-report.jpg)

'shiny' uses the next lambda. But 'jasper' is not using this lambda now. Consider using the same data service.

- [func-transform-data-samples](https://github.com/operatochef/serverless/tree/main/func-transform-data-samples)

## Partition Keys

At the early stage, partition keys are desinged for dynamic partitioning for Athena. But It will be required so many AWS Glue crawlers also by each 'data-sets'.

Partition keys are related for S3 request limitations.

> **3,500 PUT/COPY/POST/DELETE or 5,500 GET/HEAD requests per second per prefix in a bucket**

- https://docs.aws.amazon.com/AmazonS3/latest/userguide/optimizing-performance.html

### :warning: This concept will be deprecated.

Now partition keys are fixed

- domain
- datasetid
- date: local time date
- workdate: working date
- workshift

### Glue Catalog Table Indices

Partitions can be indices. You can create new indices with combination of partitions.
It affects query performance and finding partitions.
![partitions and indices](./assets/images/glue-table-indices-for-dataset.png)

## Timestamp of Data Samples

sample data could have an own timestamp if it is from a sensor data.
'collected_at' uses this timestamp.
Manual type of data is used 'Date.now() and new Date()'
Graphql might affect timezone of server os for Date type field.
'TZ=UTC node' can help to solve this when server starts.
Or use `process.env.TZ = 'UTC'`.
Now applied in 'create-data-samples.ts'

## Data Archive

제출용 데이터를 위해 data_samples를 다운로드 하는 기능입니다. csv.gz 형태로 다운로드 가능한 임시 url을 제공합니다. 해당 기능을 위해 [func-data-set-download](https://github.com/operatochef/serverless/tree/main/func-data-set-download) lambda를 사용합니다. 이는 수동 수집용 데이터에 적합합니다. 자동 수집 데이터는 lambda로 처리하기에는 많은 메모리가 필요할 수 있습니다. 따라서, 데이타셋 유형별 처리가 필요할 것 같습니다.
Glue Job을 이용한 처리를 진행해보았으나, 시간이 너무 오래걸리는 문제가 있었습니다. 해당 내용은 AWS ibex계정의 Glue Jobs - 'reference_app_samples_archive' 리소스를 참고바랍니다.
