# thoth

## Description

* Thoth是古埃及神话智慧之神的含义，对于forchange来说thoth就是数据部门的大数据元数据管理平台的含义，它包含技术元数据(数据源元数据、ETL元数据、数据血缘关系等等)和业务元数据(业务边界、指标口径等等)。

## Table Design

### DataSource

![数据源元数据表设计](/files/ix6YHBcxSqvADcDjiOSg)

## MetaData Collector

### DataSource Metadata Collector

* 数据源元数据采集器，采集Hive、Pg、Mysql等数据源元数据采集，提供定时和实时元数据采集。

#### Hive元数据采集

**定时数据采集任务**

**Table信息采集**

* SQL

```sql
-- 采集单个schema下全部table元数据
SELECT
	tbls1.TBL_NAME tbl_name,
	tbls1.TBL_TYPE tbl_type,
	tbls1.CREATE_TIME tbl_create_time,
	tbls1.LAST_ACCESS_TIME tbl_last_access_time,
	tbls1.`OWNER` owner_name,
	sds1.NUM_BUCKETS num_buckets,
	sds1.LOCATION location,
	sds1.IS_COMPRESSED is_compressed,
	sds1.INPUT_FORMAT input_format,
	sds1.OUTPUT_FORMAT output_format,
	p.PKEY_NAME partition_field,
	p.PKEY_TYPE partition_type,
	p.PKEY_COMMENT partition_comment
FROM
	hivemeta.tbls tbls1
	JOIN hivemeta.dbs dbs1 ON tbls1.DB_ID = dbs1.DB_ID 
	AND dbs1.NAME = "for_ods"
	JOIN hivemeta.sds sds1 ON sds1.SD_ID = tbls1.SD_ID
	JOIN hivemeta.partition_keys p ON p.TBL_ID = tbls1.TBL_ID
	
--	采集单个schema的某个table的元数据
SELECT
	tbls1.TBL_NAME tbl_name,
	tbls1.TBL_TYPE tbl_type,
	tbls1.CREATE_TIME tbl_create_time,
	tbls1.LAST_ACCESS_TIME tbl_last_access_time,
	tbls1.`OWNER` owner_name,
	sds1.NUM_BUCKETS num_buckets,
	sds1.LOCATION location,
	sds1.IS_COMPRESSED is_compressed,
	sds1.INPUT_FORMAT input_format,
	sds1.OUTPUT_FORMAT output_format,
	p.PKEY_NAME partition_field,
	p.PKEY_TYPE partition_type,
	p.PKEY_COMMENT partition_comment
FROM
	hivemeta.tbls tbls1
	JOIN hivemeta.dbs dbs1 ON tbls1.DB_ID = dbs1.DB_ID 
	AND dbs1.NAME = "for_ods"
	AND tbls1.TBL_NAME="ods_aww_2005_external_group_chat_t"
	JOIN hivemeta.sds sds1 ON sds1.SD_ID = tbls1.SD_ID
	JOIN hivemeta.partition_keys p ON p.TBL_ID = tbls1.TBL_ID
```

* 处理逻辑
  * 根据DataSource的配置获取SchemaName，调用上述SQL拉取HiveTable相关元数据信息
  * 循环遍历hive table元数据信息构建Table对象，查询当前tableName在table表中`最大版本`对象，`如果最大版本不存在`，则直接将构建的Table对象插入table表。并且内存中维护instanceName+schemaName+tableName的Hash值和tableId的映射。
  * 如果存在最大版本，比较table表中的相关属性(tableName、扩展属性、OwnerName、lastAccessTime、creationTime)，如果该信息发生变化，则替换最大版本Table相关属性，并且将version+1，重新插入`instanceSchemaTableNameAndIdMap`内存映射。

**Column信息采集**

* SQL

```sql
SELECT
	tbls1.TBL_NAME tbl_name,
	cv2.INTEGER_IDX column_index,
	cv2.COMMENT column_comment,
	cv2.TYPE_NAME type_name,
	cv2.COLUMN_NAME column_name
FROM
	hivemeta.tbls tbls1
	JOIN hivemeta.dbs dbs1 ON tbls1.DB_ID = dbs1.DB_ID 
	AND dbs1.NAME = "for_ods"
	JOIN hivemeta.sds sds1 ON sds1.SD_ID = tbls1.SD_ID
	JOIN hivemeta.columns_v2 cv2 ON sds1.CD_ID = cv2.CD_ID
```

* 处理逻辑
  * 根据schemaName调用上述SQL获取其他全部的表名和列信息
  * 从`instanceSchemaTableNameAndIdMap`根据instance、schema、table的名称获取tableId(最大版本的)，如果tableId不存在则更新table表元数据。
  * 根据tableId和columnName获取已经存在的Column，如果不存在则直接将现有的column元数据插入columns表，并且刷新`tableIdAndColumnsMap`缓存。
  * 如果`tableIdAndColumnsMap`存在该Column，则比较内存中的column和新查询出来的column信息，如果不相同则新插入一条新的column记录，其版本号+1。

#### MySQL元数据采集


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://shimin-huang.gitbook.io/doc/datawarehouse/shu-ju-zhong-tai-mo-kuai-she-ji/thoth-zi-yan-yuan-shu-ju-ping-tai-she-ji.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
