<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://home.stonezhong.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Stonezhong</id>
	<title>stonehomewiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://home.stonezhong.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Stonezhong"/>
	<link rel="alternate" type="text/html" href="https://home.stonezhong.net/index.php/Special:Contributions/Stonezhong"/>
	<updated>2026-10-03T23:56:37Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.2</generator>
	<entry>
		<id>https://home.stonezhong.net/index.php?title=Dl/test&amp;diff=462</id>
		<title>Dl/test</title>
		<link rel="alternate" type="text/html" href="https://home.stonezhong.net/index.php?title=Dl/test&amp;diff=462"/>
		<updated>2026-01-05T09:02:26Z</updated>

		<summary type="html">&lt;p&gt;Stonezhong: Created page with &amp;quot;hello&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;hello&lt;/div&gt;</summary>
		<author><name>Stonezhong</name></author>
	</entry>
	<entry>
		<id>https://home.stonezhong.net/index.php?title=Dl/Overview&amp;diff=461</id>
		<title>Dl/Overview</title>
		<link rel="alternate" type="text/html" href="https://home.stonezhong.net/index.php?title=Dl/Overview&amp;diff=461"/>
		<updated>2025-11-25T21:02:24Z</updated>

		<summary type="html">&lt;p&gt;Stonezhong: /* ETL */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;p&amp;gt;[[dl/home|Data Lake Knowledge Center]]&amp;lt;/p&amp;gt;&lt;br /&gt;
= Data Tiers =&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;Data Tiers&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable grid mono section&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Diagram&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
{{#mermaid:&lt;br /&gt;
graph TD&lt;br /&gt;
    BornzeTier[Bronze Tier]&lt;br /&gt;
    SilverTier[Silver Tier]&lt;br /&gt;
    GoldTier[Gold Tier]&lt;br /&gt;
    PlatniumTier[Platnium Tier]&lt;br /&gt;
    ExternalData[External Data]&lt;br /&gt;
&lt;br /&gt;
    ExternalData --ingestion--&amp;gt; BornzeTier --ingestion--&amp;gt; SilverTier --ETL--&amp;gt; GoldTier --ETL--&amp;gt; PlatniumTier&lt;br /&gt;
}}&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;Bronze Tier&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;:&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;The purpose for bronze tier is to store data downloaded from external world into data lake so we can use all sort of tools inside data lake to further process it&amp;lt;/b&amp;gt;&lt;br /&gt;
* raw data&lt;br /&gt;
* no uniformed format, could be csv, JSON, AVRO, parquet, binary, anything&lt;br /&gt;
* could even be unstructured&lt;br /&gt;
* no data quality assurance&lt;br /&gt;
&amp;lt;hr /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;Silver Tier&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;:&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;The purpose for bronze tier is to allow data ingestion application to sanitize data, verify the quality of the data&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Data quality is assurred&lt;br /&gt;
* Data may not be normalized. One table may use UTC for a timestamp column while aother table may use timestamp without timezone. No stadnardlization for column name.&lt;br /&gt;
* Data format is uniformed, usually it is stored as a format that is best fits the further ETL process, for example parquet.&lt;br /&gt;
&amp;lt;hr /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;Gold Tier&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;:&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Tables for star schema&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* dimention tables and fact tables that forms star schema&lt;br /&gt;
* a star schema is designed in such a way that it can answer any question about a business area.&lt;br /&gt;
&amp;lt;hr /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;Platinum Tier&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;:&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Various query result for specific business questions materized in tables&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Various query result for specific business questions materized in tables&lt;br /&gt;
** Queries are generated from star schema from gold tier&lt;br /&gt;
* Tables may be replicated to a RDBMS for BI tool to access (sometime you can expose them directly, e.g. Spark Thrift Server)&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ETL =&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;ETL Flow&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
{{#mermaid:&lt;br /&gt;
graph TD&lt;br /&gt;
    Scheduler[Apache Airflow/Scheduler]&lt;br /&gt;
    ETLE[ETL Executor#40;Airflow Task#41;]&lt;br /&gt;
    LC[Local ETL Code]&lt;br /&gt;
    ER[ETL Code Repo]&lt;br /&gt;
    JDBC[JDBC#40;Thrift Server#41;]&lt;br /&gt;
    User[User#40;Data Engineer#41;]&lt;br /&gt;
    Spark[Apache Spark]&lt;br /&gt;
    Scheduler --2: trigger--&amp;gt; ETLE&lt;br /&gt;
    ETLE --3: git pull --&amp;gt;LC&lt;br /&gt;
    ETLE --4: dbt--&amp;gt; JDBC&lt;br /&gt;
    JDBC --5:--&amp;gt; Spark&lt;br /&gt;
    ER --&amp;gt; LC&lt;br /&gt;
    User --1: git push--&amp;gt;ER&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 1: User pushes ETL code into ETL Code Repo&lt;br /&gt;
* 2: Airflow Scheduler trigger DAG (DAG is generated based on metadata)&lt;br /&gt;
** The ETL job is a task within an airflow DAG&lt;br /&gt;
* 3: ETL executor pulls code from ETL Code Repo into loacl disk&lt;br /&gt;
* 4: ETL executor uses dbt library to submit job to Apache Spark via JDBC interface (e.g. via Thrift Server)&lt;br /&gt;
* 5: Thrift Server take the SQL and pass it to Apache Spark to execute&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= BI Connection =&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;Using MPP Engine&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
{{#mermaid:&lt;br /&gt;
graph TD&lt;br /&gt;
    subgraph storage&lt;br /&gt;
        GoldTier[Gold Tier]&lt;br /&gt;
        PlatniumTier[Platnium Tier]&lt;br /&gt;
    end&lt;br /&gt;
    JDBC[JDBC Interface]&lt;br /&gt;
    MPP[MPP Engine #40;Starburst Trino#41;]&lt;br /&gt;
    BI[BI Tool #40;Power BI#41;]&lt;br /&gt;
    GoldTier --&amp;gt; MPP&lt;br /&gt;
    PlatniumTier --&amp;gt; MPP&lt;br /&gt;
    MPP --&amp;gt; JDBC --&amp;gt; BI&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* BI Tool to access Gold Tier data and Platnium Tier data via JDBC interface exposed by a MPP engine&lt;br /&gt;
** Why? A MPP Engine provide better interactive SQL query speed than Spark Thrift Server&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;Using RDBMS&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
{{#mermaid:&lt;br /&gt;
graph TD&lt;br /&gt;
    subgraph storage&lt;br /&gt;
        GoldTier[Gold Tier]&lt;br /&gt;
        PlatniumTier[Platnium Tier]&lt;br /&gt;
    end&lt;br /&gt;
    RDBMS[RDBMS#40;Oracle ADW#41;]&lt;br /&gt;
    JDBC[JDBC Interface]&lt;br /&gt;
    BI[BI Tool #40;Power BI#41;]&lt;br /&gt;
    GoldTier --replicate--&amp;gt; RDBMS&lt;br /&gt;
    PlatniumTier --replicate--&amp;gt; RDBMS&lt;br /&gt;
    RDBMS --&amp;gt; JDBC --&amp;gt; BI&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Gold Tier data and Platnium Tier data are replicated to RDBMS, such as Oracle DB&lt;br /&gt;
* BI Tool to access Gold Tier data and Platnium Tier data via JDBC interface exposed by RDBMS&lt;br /&gt;
* This pattern does not work for very large datalake since Gold Tier and Platnium Tier are too large to be replicated to RDBMS&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Stonezhong</name></author>
	</entry>
	<entry>
		<id>https://home.stonezhong.net/index.php?title=Dl/Overview&amp;diff=460</id>
		<title>Dl/Overview</title>
		<link rel="alternate" type="text/html" href="https://home.stonezhong.net/index.php?title=Dl/Overview&amp;diff=460"/>
		<updated>2025-11-25T19:02:56Z</updated>

		<summary type="html">&lt;p&gt;Stonezhong: /* Data Tiers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;p&amp;gt;[[dl/home|Data Lake Knowledge Center]]&amp;lt;/p&amp;gt;&lt;br /&gt;
= Data Tiers =&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;Data Tiers&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable grid mono section&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Diagram&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
{{#mermaid:&lt;br /&gt;
graph TD&lt;br /&gt;
    BornzeTier[Bronze Tier]&lt;br /&gt;
    SilverTier[Silver Tier]&lt;br /&gt;
    GoldTier[Gold Tier]&lt;br /&gt;
    PlatniumTier[Platnium Tier]&lt;br /&gt;
    ExternalData[External Data]&lt;br /&gt;
&lt;br /&gt;
    ExternalData --ingestion--&amp;gt; BornzeTier --ingestion--&amp;gt; SilverTier --ETL--&amp;gt; GoldTier --ETL--&amp;gt; PlatniumTier&lt;br /&gt;
}}&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;Bronze Tier&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;:&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;The purpose for bronze tier is to store data downloaded from external world into data lake so we can use all sort of tools inside data lake to further process it&amp;lt;/b&amp;gt;&lt;br /&gt;
* raw data&lt;br /&gt;
* no uniformed format, could be csv, JSON, AVRO, parquet, binary, anything&lt;br /&gt;
* could even be unstructured&lt;br /&gt;
* no data quality assurance&lt;br /&gt;
&amp;lt;hr /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;Silver Tier&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;:&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;The purpose for bronze tier is to allow data ingestion application to sanitize data, verify the quality of the data&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Data quality is assurred&lt;br /&gt;
* Data may not be normalized. One table may use UTC for a timestamp column while aother table may use timestamp without timezone. No stadnardlization for column name.&lt;br /&gt;
* Data format is uniformed, usually it is stored as a format that is best fits the further ETL process, for example parquet.&lt;br /&gt;
&amp;lt;hr /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;Gold Tier&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;:&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Tables for star schema&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* dimention tables and fact tables that forms star schema&lt;br /&gt;
* a star schema is designed in such a way that it can answer any question about a business area.&lt;br /&gt;
&amp;lt;hr /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;Platinum Tier&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;:&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Various query result for specific business questions materized in tables&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Various query result for specific business questions materized in tables&lt;br /&gt;
** Queries are generated from star schema from gold tier&lt;br /&gt;
* Tables may be replicated to a RDBMS for BI tool to access (sometime you can expose them directly, e.g. Spark Thrift Server)&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ETL =&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;ETL Flow&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
{{#mermaid:&lt;br /&gt;
graph TD&lt;br /&gt;
    Scheduler[Apache Airflow/Scheduler]&lt;br /&gt;
    ETLE[ETL Executor&amp;amp;lt;Airflow Task&amp;amp;gt;]&lt;br /&gt;
    LC[Local ETL Code]&lt;br /&gt;
    ER[ETL Code Repo]&lt;br /&gt;
    JDBC[JDBC&amp;amp;lt;Thrift Server&amp;amp;gt;]&lt;br /&gt;
    User[User&amp;amp;lt;Data Engineer&amp;amp;gt;]&lt;br /&gt;
    Spark[Apache Spark]&lt;br /&gt;
    Scheduler --2: trigger--&amp;gt; ETLE&lt;br /&gt;
    ETLE --3: git pull --&amp;gt;LC&lt;br /&gt;
    ETLE --4: dbt--&amp;gt; JDBC&lt;br /&gt;
    JDBC --5:--&amp;gt; Spark&lt;br /&gt;
    ER --&amp;gt; LC&lt;br /&gt;
    User --1: git push--&amp;gt;ER&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 1: User pushes ETL code into ETL Code Repo&lt;br /&gt;
* 2: Airflow Scheduler trigger DAG (DAG is generated based on metadata)&lt;br /&gt;
** The ETL job is a task within an airflow DAG&lt;br /&gt;
* 3: ETL executor pulls code from ETL Code Repo into loacl disk&lt;br /&gt;
* 4: ETL executor uses dbt library to submit job to Apache Spark via JDBC interface (e.g. via Thrift Server)&lt;br /&gt;
* 5: Thrift Server take the SQL and pass it to Apache Spark to execute&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= BI Connection =&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;Using MPP Engine&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
{{#mermaid:&lt;br /&gt;
graph TD&lt;br /&gt;
    subgraph storage&lt;br /&gt;
        GoldTier[Gold Tier]&lt;br /&gt;
        PlatniumTier[Platnium Tier]&lt;br /&gt;
    end&lt;br /&gt;
    JDBC[JDBC Interface]&lt;br /&gt;
    MPP[MPP Engine #40;Starburst Trino#41;]&lt;br /&gt;
    BI[BI Tool #40;Power BI#41;]&lt;br /&gt;
    GoldTier --&amp;gt; MPP&lt;br /&gt;
    PlatniumTier --&amp;gt; MPP&lt;br /&gt;
    MPP --&amp;gt; JDBC --&amp;gt; BI&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* BI Tool to access Gold Tier data and Platnium Tier data via JDBC interface exposed by a MPP engine&lt;br /&gt;
** Why? A MPP Engine provide better interactive SQL query speed than Spark Thrift Server&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;Using RDBMS&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
{{#mermaid:&lt;br /&gt;
graph TD&lt;br /&gt;
    subgraph storage&lt;br /&gt;
        GoldTier[Gold Tier]&lt;br /&gt;
        PlatniumTier[Platnium Tier]&lt;br /&gt;
    end&lt;br /&gt;
    RDBMS[RDBMS#40;Oracle ADW#41;]&lt;br /&gt;
    JDBC[JDBC Interface]&lt;br /&gt;
    BI[BI Tool #40;Power BI#41;]&lt;br /&gt;
    GoldTier --replicate--&amp;gt; RDBMS&lt;br /&gt;
    PlatniumTier --replicate--&amp;gt; RDBMS&lt;br /&gt;
    RDBMS --&amp;gt; JDBC --&amp;gt; BI&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Gold Tier data and Platnium Tier data are replicated to RDBMS, such as Oracle DB&lt;br /&gt;
* BI Tool to access Gold Tier data and Platnium Tier data via JDBC interface exposed by RDBMS&lt;br /&gt;
* This pattern does not work for very large datalake since Gold Tier and Platnium Tier are too large to be replicated to RDBMS&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Stonezhong</name></author>
	</entry>
	<entry>
		<id>https://home.stonezhong.net/index.php?title=Dl/Overview&amp;diff=459</id>
		<title>Dl/Overview</title>
		<link rel="alternate" type="text/html" href="https://home.stonezhong.net/index.php?title=Dl/Overview&amp;diff=459"/>
		<updated>2025-11-25T19:00:46Z</updated>

		<summary type="html">&lt;p&gt;Stonezhong: /* Data Tiers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;p&amp;gt;[[dl/home|Data Lake Knowledge Center]]&amp;lt;/p&amp;gt;&lt;br /&gt;
= Data Tiers =&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;Data Tiers&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable grid mono section&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Diagram&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
{{#mermaid:&lt;br /&gt;
graph TD&lt;br /&gt;
    BornzeTier[Bronze Tier]&lt;br /&gt;
    SilverTier[Silver Tier]&lt;br /&gt;
    GoldTier[Gold Tier]&lt;br /&gt;
    PlatniumTier[Platnium Tier]&lt;br /&gt;
    ExternalData[External Data]&lt;br /&gt;
&lt;br /&gt;
    ExternalData --ingestion--&amp;gt; BornzeTier --ingestion--&amp;gt; SilverTier --ETL--&amp;gt; GoldTier --ETL--&amp;gt; PlatniumTier&lt;br /&gt;
}}&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;Bronze Tier&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;:&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;The purpose for bronze tier is to store data downloaded from external world into data lake so we can use all sort of tools inside data lake to further process it&amp;lt;/b&amp;gt;&lt;br /&gt;
* raw data&lt;br /&gt;
* no uniformed format, could be csv, JSON, AVRO, parquet, binary, anything&lt;br /&gt;
* could even be unstructured&lt;br /&gt;
* no data quality assurance&lt;br /&gt;
&amp;lt;hr /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;Silver Tier&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;:&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;The purpose for bronze tier is to allow data ingestion application to sanitize data, verify the quality of the data&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Data quality is assurred&lt;br /&gt;
* Data may not be normalized. One table may use UTC for a timestamp column while aother table may use timestamp without timezone. No stadnardlization for column name.&lt;br /&gt;
* Data format is uniformed, usually it is stored as a format that is best fits the further ETL process, for example parquet.&lt;br /&gt;
&amp;lt;hr /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;Gold Tier&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;:&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Tables for star schema&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* dimention tables and fact tables that forms star schema&lt;br /&gt;
&amp;lt;hr /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;Platinum Tier&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;:&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Various query result for specific business questions materized in tables&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Various query result for specific business questions materized in tables&lt;br /&gt;
* Tables may be replicated to a RDBMS for BI tool to access (sometime you can expose them directly, e.g. Spark Thrift Server)&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ETL =&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;ETL Flow&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
{{#mermaid:&lt;br /&gt;
graph TD&lt;br /&gt;
    Scheduler[Apache Airflow/Scheduler]&lt;br /&gt;
    ETLE[ETL Executor&amp;amp;lt;Airflow Task&amp;amp;gt;]&lt;br /&gt;
    LC[Local ETL Code]&lt;br /&gt;
    ER[ETL Code Repo]&lt;br /&gt;
    JDBC[JDBC&amp;amp;lt;Thrift Server&amp;amp;gt;]&lt;br /&gt;
    User[User&amp;amp;lt;Data Engineer&amp;amp;gt;]&lt;br /&gt;
    Spark[Apache Spark]&lt;br /&gt;
    Scheduler --2: trigger--&amp;gt; ETLE&lt;br /&gt;
    ETLE --3: git pull --&amp;gt;LC&lt;br /&gt;
    ETLE --4: dbt--&amp;gt; JDBC&lt;br /&gt;
    JDBC --5:--&amp;gt; Spark&lt;br /&gt;
    ER --&amp;gt; LC&lt;br /&gt;
    User --1: git push--&amp;gt;ER&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 1: User pushes ETL code into ETL Code Repo&lt;br /&gt;
* 2: Airflow Scheduler trigger DAG (DAG is generated based on metadata)&lt;br /&gt;
** The ETL job is a task within an airflow DAG&lt;br /&gt;
* 3: ETL executor pulls code from ETL Code Repo into loacl disk&lt;br /&gt;
* 4: ETL executor uses dbt library to submit job to Apache Spark via JDBC interface (e.g. via Thrift Server)&lt;br /&gt;
* 5: Thrift Server take the SQL and pass it to Apache Spark to execute&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= BI Connection =&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;Using MPP Engine&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
{{#mermaid:&lt;br /&gt;
graph TD&lt;br /&gt;
    subgraph storage&lt;br /&gt;
        GoldTier[Gold Tier]&lt;br /&gt;
        PlatniumTier[Platnium Tier]&lt;br /&gt;
    end&lt;br /&gt;
    JDBC[JDBC Interface]&lt;br /&gt;
    MPP[MPP Engine #40;Starburst Trino#41;]&lt;br /&gt;
    BI[BI Tool #40;Power BI#41;]&lt;br /&gt;
    GoldTier --&amp;gt; MPP&lt;br /&gt;
    PlatniumTier --&amp;gt; MPP&lt;br /&gt;
    MPP --&amp;gt; JDBC --&amp;gt; BI&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* BI Tool to access Gold Tier data and Platnium Tier data via JDBC interface exposed by a MPP engine&lt;br /&gt;
** Why? A MPP Engine provide better interactive SQL query speed than Spark Thrift Server&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;Using RDBMS&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
{{#mermaid:&lt;br /&gt;
graph TD&lt;br /&gt;
    subgraph storage&lt;br /&gt;
        GoldTier[Gold Tier]&lt;br /&gt;
        PlatniumTier[Platnium Tier]&lt;br /&gt;
    end&lt;br /&gt;
    RDBMS[RDBMS#40;Oracle ADW#41;]&lt;br /&gt;
    JDBC[JDBC Interface]&lt;br /&gt;
    BI[BI Tool #40;Power BI#41;]&lt;br /&gt;
    GoldTier --replicate--&amp;gt; RDBMS&lt;br /&gt;
    PlatniumTier --replicate--&amp;gt; RDBMS&lt;br /&gt;
    RDBMS --&amp;gt; JDBC --&amp;gt; BI&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Gold Tier data and Platnium Tier data are replicated to RDBMS, such as Oracle DB&lt;br /&gt;
* BI Tool to access Gold Tier data and Platnium Tier data via JDBC interface exposed by RDBMS&lt;br /&gt;
* This pattern does not work for very large datalake since Gold Tier and Platnium Tier are too large to be replicated to RDBMS&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Stonezhong</name></author>
	</entry>
	<entry>
		<id>https://home.stonezhong.net/index.php?title=Dl/home&amp;diff=458</id>
		<title>Dl/home</title>
		<link rel="alternate" type="text/html" href="https://home.stonezhong.net/index.php?title=Dl/home&amp;diff=458"/>
		<updated>2025-11-25T19:00:30Z</updated>

		<summary type="html">&lt;p&gt;Stonezhong: /* Data Tiers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= [[dl/Overview|Overview]] =&lt;br /&gt;
&lt;br /&gt;
= [[dl/Models|Models]] =&lt;br /&gt;
= [[dl/DatasetRepository|Dataset Repository]] =&lt;br /&gt;
= [[dl/DataApplication|Data Application]] =&lt;br /&gt;
= [[dl/devops|devops]] =&lt;br /&gt;
= [[dl/sprint|sprint]] =&lt;br /&gt;
= [[dl/glossary|Glossary]] =&lt;br /&gt;
= [[dl/Notes|Notes]] =&lt;br /&gt;
= [[dl/Product Release Checklist|Product Release Checklist]] =&lt;br /&gt;
= [[dl/Best Practices|Best Practices]] =&lt;/div&gt;</summary>
		<author><name>Stonezhong</name></author>
	</entry>
	<entry>
		<id>https://home.stonezhong.net/index.php?title=Dl/Overview&amp;diff=457</id>
		<title>Dl/Overview</title>
		<link rel="alternate" type="text/html" href="https://home.stonezhong.net/index.php?title=Dl/Overview&amp;diff=457"/>
		<updated>2025-11-25T19:00:03Z</updated>

		<summary type="html">&lt;p&gt;Stonezhong: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;p&amp;gt;[[dl/home|Data Lake Knowledge Center]]&amp;lt;/p&amp;gt;&lt;br /&gt;
= Data Tiers =&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;Using RDBMS&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable grid mono section&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Diagram&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
{{#mermaid:&lt;br /&gt;
graph TD&lt;br /&gt;
    BornzeTier[Bronze Tier]&lt;br /&gt;
    SilverTier[Silver Tier]&lt;br /&gt;
    GoldTier[Gold Tier]&lt;br /&gt;
    PlatniumTier[Platnium Tier]&lt;br /&gt;
    ExternalData[External Data]&lt;br /&gt;
&lt;br /&gt;
    ExternalData --ingestion--&amp;gt; BornzeTier --ingestion--&amp;gt; SilverTier --ETL--&amp;gt; GoldTier --ETL--&amp;gt; PlatniumTier&lt;br /&gt;
}}&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;Bronze Tier&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;:&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;The purpose for bronze tier is to store data downloaded from external world into data lake so we can use all sort of tools inside data lake to further process it&amp;lt;/b&amp;gt;&lt;br /&gt;
* raw data&lt;br /&gt;
* no uniformed format, could be csv, JSON, AVRO, parquet, binary, anything&lt;br /&gt;
* could even be unstructured&lt;br /&gt;
* no data quality assurance&lt;br /&gt;
&amp;lt;hr /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;Silver Tier&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;:&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;The purpose for bronze tier is to allow data ingestion application to sanitize data, verify the quality of the data&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Data quality is assurred&lt;br /&gt;
* Data may not be normalized. One table may use UTC for a timestamp column while aother table may use timestamp without timezone. No stadnardlization for column name.&lt;br /&gt;
* Data format is uniformed, usually it is stored as a format that is best fits the further ETL process, for example parquet.&lt;br /&gt;
&amp;lt;hr /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;Gold Tier&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;:&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Tables for star schema&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* dimention tables and fact tables that forms star schema&lt;br /&gt;
&amp;lt;hr /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;Platinum Tier&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;:&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Various query result for specific business questions materized in tables&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Various query result for specific business questions materized in tables&lt;br /&gt;
* Tables may be replicated to a RDBMS for BI tool to access (sometime you can expose them directly, e.g. Spark Thrift Server)&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ETL =&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;ETL Flow&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
{{#mermaid:&lt;br /&gt;
graph TD&lt;br /&gt;
    Scheduler[Apache Airflow/Scheduler]&lt;br /&gt;
    ETLE[ETL Executor&amp;amp;lt;Airflow Task&amp;amp;gt;]&lt;br /&gt;
    LC[Local ETL Code]&lt;br /&gt;
    ER[ETL Code Repo]&lt;br /&gt;
    JDBC[JDBC&amp;amp;lt;Thrift Server&amp;amp;gt;]&lt;br /&gt;
    User[User&amp;amp;lt;Data Engineer&amp;amp;gt;]&lt;br /&gt;
    Spark[Apache Spark]&lt;br /&gt;
    Scheduler --2: trigger--&amp;gt; ETLE&lt;br /&gt;
    ETLE --3: git pull --&amp;gt;LC&lt;br /&gt;
    ETLE --4: dbt--&amp;gt; JDBC&lt;br /&gt;
    JDBC --5:--&amp;gt; Spark&lt;br /&gt;
    ER --&amp;gt; LC&lt;br /&gt;
    User --1: git push--&amp;gt;ER&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 1: User pushes ETL code into ETL Code Repo&lt;br /&gt;
* 2: Airflow Scheduler trigger DAG (DAG is generated based on metadata)&lt;br /&gt;
** The ETL job is a task within an airflow DAG&lt;br /&gt;
* 3: ETL executor pulls code from ETL Code Repo into loacl disk&lt;br /&gt;
* 4: ETL executor uses dbt library to submit job to Apache Spark via JDBC interface (e.g. via Thrift Server)&lt;br /&gt;
* 5: Thrift Server take the SQL and pass it to Apache Spark to execute&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= BI Connection =&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;Using MPP Engine&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
{{#mermaid:&lt;br /&gt;
graph TD&lt;br /&gt;
    subgraph storage&lt;br /&gt;
        GoldTier[Gold Tier]&lt;br /&gt;
        PlatniumTier[Platnium Tier]&lt;br /&gt;
    end&lt;br /&gt;
    JDBC[JDBC Interface]&lt;br /&gt;
    MPP[MPP Engine #40;Starburst Trino#41;]&lt;br /&gt;
    BI[BI Tool #40;Power BI#41;]&lt;br /&gt;
    GoldTier --&amp;gt; MPP&lt;br /&gt;
    PlatniumTier --&amp;gt; MPP&lt;br /&gt;
    MPP --&amp;gt; JDBC --&amp;gt; BI&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* BI Tool to access Gold Tier data and Platnium Tier data via JDBC interface exposed by a MPP engine&lt;br /&gt;
** Why? A MPP Engine provide better interactive SQL query speed than Spark Thrift Server&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;Using RDBMS&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
{{#mermaid:&lt;br /&gt;
graph TD&lt;br /&gt;
    subgraph storage&lt;br /&gt;
        GoldTier[Gold Tier]&lt;br /&gt;
        PlatniumTier[Platnium Tier]&lt;br /&gt;
    end&lt;br /&gt;
    RDBMS[RDBMS#40;Oracle ADW#41;]&lt;br /&gt;
    JDBC[JDBC Interface]&lt;br /&gt;
    BI[BI Tool #40;Power BI#41;]&lt;br /&gt;
    GoldTier --replicate--&amp;gt; RDBMS&lt;br /&gt;
    PlatniumTier --replicate--&amp;gt; RDBMS&lt;br /&gt;
    RDBMS --&amp;gt; JDBC --&amp;gt; BI&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Gold Tier data and Platnium Tier data are replicated to RDBMS, such as Oracle DB&lt;br /&gt;
* BI Tool to access Gold Tier data and Platnium Tier data via JDBC interface exposed by RDBMS&lt;br /&gt;
* This pattern does not work for very large datalake since Gold Tier and Platnium Tier are too large to be replicated to RDBMS&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Stonezhong</name></author>
	</entry>
	<entry>
		<id>https://home.stonezhong.net/index.php?title=Dl/Overview&amp;diff=456</id>
		<title>Dl/Overview</title>
		<link rel="alternate" type="text/html" href="https://home.stonezhong.net/index.php?title=Dl/Overview&amp;diff=456"/>
		<updated>2025-11-25T18:58:41Z</updated>

		<summary type="html">&lt;p&gt;Stonezhong: /* BI Connection */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;p&amp;gt;[[dl/home|Data Lake Knowledge Center]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ETL =&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;ETL Flow&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
{{#mermaid:&lt;br /&gt;
graph TD&lt;br /&gt;
    Scheduler[Apache Airflow/Scheduler]&lt;br /&gt;
    ETLE[ETL Executor&amp;amp;lt;Airflow Task&amp;amp;gt;]&lt;br /&gt;
    LC[Local ETL Code]&lt;br /&gt;
    ER[ETL Code Repo]&lt;br /&gt;
    JDBC[JDBC&amp;amp;lt;Thrift Server&amp;amp;gt;]&lt;br /&gt;
    User[User&amp;amp;lt;Data Engineer&amp;amp;gt;]&lt;br /&gt;
    Spark[Apache Spark]&lt;br /&gt;
    Scheduler --2: trigger--&amp;gt; ETLE&lt;br /&gt;
    ETLE --3: git pull --&amp;gt;LC&lt;br /&gt;
    ETLE --4: dbt--&amp;gt; JDBC&lt;br /&gt;
    JDBC --5:--&amp;gt; Spark&lt;br /&gt;
    ER --&amp;gt; LC&lt;br /&gt;
    User --1: git push--&amp;gt;ER&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 1: User pushes ETL code into ETL Code Repo&lt;br /&gt;
* 2: Airflow Scheduler trigger DAG (DAG is generated based on metadata)&lt;br /&gt;
** The ETL job is a task within an airflow DAG&lt;br /&gt;
* 3: ETL executor pulls code from ETL Code Repo into loacl disk&lt;br /&gt;
* 4: ETL executor uses dbt library to submit job to Apache Spark via JDBC interface (e.g. via Thrift Server)&lt;br /&gt;
* 5: Thrift Server take the SQL and pass it to Apache Spark to execute&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= BI Connection =&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;Using MPP Engine&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
{{#mermaid:&lt;br /&gt;
graph TD&lt;br /&gt;
    subgraph storage&lt;br /&gt;
        GoldTier[Gold Tier]&lt;br /&gt;
        PlatniumTier[Platnium Tier]&lt;br /&gt;
    end&lt;br /&gt;
    JDBC[JDBC Interface]&lt;br /&gt;
    MPP[MPP Engine #40;Starburst Trino#41;]&lt;br /&gt;
    BI[BI Tool #40;Power BI#41;]&lt;br /&gt;
    GoldTier --&amp;gt; MPP&lt;br /&gt;
    PlatniumTier --&amp;gt; MPP&lt;br /&gt;
    MPP --&amp;gt; JDBC --&amp;gt; BI&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* BI Tool to access Gold Tier data and Platnium Tier data via JDBC interface exposed by a MPP engine&lt;br /&gt;
** Why? A MPP Engine provide better interactive SQL query speed than Spark Thrift Server&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;Using RDBMS&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
{{#mermaid:&lt;br /&gt;
graph TD&lt;br /&gt;
    subgraph storage&lt;br /&gt;
        GoldTier[Gold Tier]&lt;br /&gt;
        PlatniumTier[Platnium Tier]&lt;br /&gt;
    end&lt;br /&gt;
    RDBMS[RDBMS#40;Oracle ADW#41;]&lt;br /&gt;
    JDBC[JDBC Interface]&lt;br /&gt;
    BI[BI Tool #40;Power BI#41;]&lt;br /&gt;
    GoldTier --replicate--&amp;gt; RDBMS&lt;br /&gt;
    PlatniumTier --replicate--&amp;gt; RDBMS&lt;br /&gt;
    RDBMS --&amp;gt; JDBC --&amp;gt; BI&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Gold Tier data and Platnium Tier data are replicated to RDBMS, such as Oracle DB&lt;br /&gt;
* BI Tool to access Gold Tier data and Platnium Tier data via JDBC interface exposed by RDBMS&lt;br /&gt;
* This pattern does not work for very large datalake since Gold Tier and Platnium Tier are too large to be replicated to RDBMS&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Stonezhong</name></author>
	</entry>
	<entry>
		<id>https://home.stonezhong.net/index.php?title=Dl/Overview&amp;diff=455</id>
		<title>Dl/Overview</title>
		<link rel="alternate" type="text/html" href="https://home.stonezhong.net/index.php?title=Dl/Overview&amp;diff=455"/>
		<updated>2025-11-25T18:56:52Z</updated>

		<summary type="html">&lt;p&gt;Stonezhong: /* BI Connection */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;p&amp;gt;[[dl/home|Data Lake Knowledge Center]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ETL =&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;ETL Flow&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
{{#mermaid:&lt;br /&gt;
graph TD&lt;br /&gt;
    Scheduler[Apache Airflow/Scheduler]&lt;br /&gt;
    ETLE[ETL Executor&amp;amp;lt;Airflow Task&amp;amp;gt;]&lt;br /&gt;
    LC[Local ETL Code]&lt;br /&gt;
    ER[ETL Code Repo]&lt;br /&gt;
    JDBC[JDBC&amp;amp;lt;Thrift Server&amp;amp;gt;]&lt;br /&gt;
    User[User&amp;amp;lt;Data Engineer&amp;amp;gt;]&lt;br /&gt;
    Spark[Apache Spark]&lt;br /&gt;
    Scheduler --2: trigger--&amp;gt; ETLE&lt;br /&gt;
    ETLE --3: git pull --&amp;gt;LC&lt;br /&gt;
    ETLE --4: dbt--&amp;gt; JDBC&lt;br /&gt;
    JDBC --5:--&amp;gt; Spark&lt;br /&gt;
    ER --&amp;gt; LC&lt;br /&gt;
    User --1: git push--&amp;gt;ER&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 1: User pushes ETL code into ETL Code Repo&lt;br /&gt;
* 2: Airflow Scheduler trigger DAG (DAG is generated based on metadata)&lt;br /&gt;
** The ETL job is a task within an airflow DAG&lt;br /&gt;
* 3: ETL executor pulls code from ETL Code Repo into loacl disk&lt;br /&gt;
* 4: ETL executor uses dbt library to submit job to Apache Spark via JDBC interface (e.g. via Thrift Server)&lt;br /&gt;
* 5: Thrift Server take the SQL and pass it to Apache Spark to execute&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= BI Connection =&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;Using MPP Engine&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
{{#mermaid:&lt;br /&gt;
graph TD&lt;br /&gt;
    subgraph storage&lt;br /&gt;
        GoldTier[Gold Tier]&lt;br /&gt;
        PlatniumTier[Platnium Tier]&lt;br /&gt;
    end&lt;br /&gt;
    JDBC[JDBC Interface]&lt;br /&gt;
    MPP[MPP Engine #40;Starburst Trino#41;]&lt;br /&gt;
    BI[BI Tool #40;Power BI#41;]&lt;br /&gt;
    GoldTier --&amp;gt; MPP&lt;br /&gt;
    PlatniumTier --&amp;gt; MPP&lt;br /&gt;
    MPP --&amp;gt; JDBC --&amp;gt; BI&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* BI Tool to access Gold Tier data and Platnium Tier data via JDBC interface exposed by a MPP engine&lt;br /&gt;
** Why? A MPP Engine provide better interactive SQL query speed than Spark Thrift Server&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;Using RDBMS&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
{{#mermaid:&lt;br /&gt;
graph TD&lt;br /&gt;
    subgraph storage&lt;br /&gt;
        GoldTier[Gold Tier]&lt;br /&gt;
        PlatniumTier[Platnium Tier]&lt;br /&gt;
    end&lt;br /&gt;
    RDBMS[RDBMS#40;Oracle ADW#41;]&lt;br /&gt;
    JDBC[JDBC Interface]&lt;br /&gt;
    BI[BI Tool #40;Power BI#41;]&lt;br /&gt;
    GoldTier --replicate--&amp;gt; RDBMS&lt;br /&gt;
    PlatniumTier --replicate--&amp;gt; RDBMS&lt;br /&gt;
    RDBMS --&amp;gt; JDBC --&amp;gt; BI&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* BI Tool to access Gold Tier data and Platnium Tier data via JDBC interface exposed by a MPP engine&lt;br /&gt;
** Why? A MPP Engine provide better interactive SQL query speed than Spark Thrift Server&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Stonezhong</name></author>
	</entry>
	<entry>
		<id>https://home.stonezhong.net/index.php?title=Dl/Overview&amp;diff=454</id>
		<title>Dl/Overview</title>
		<link rel="alternate" type="text/html" href="https://home.stonezhong.net/index.php?title=Dl/Overview&amp;diff=454"/>
		<updated>2025-11-25T18:55:31Z</updated>

		<summary type="html">&lt;p&gt;Stonezhong: /* BI Connection */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;p&amp;gt;[[dl/home|Data Lake Knowledge Center]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ETL =&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;ETL Flow&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
{{#mermaid:&lt;br /&gt;
graph TD&lt;br /&gt;
    Scheduler[Apache Airflow/Scheduler]&lt;br /&gt;
    ETLE[ETL Executor&amp;amp;lt;Airflow Task&amp;amp;gt;]&lt;br /&gt;
    LC[Local ETL Code]&lt;br /&gt;
    ER[ETL Code Repo]&lt;br /&gt;
    JDBC[JDBC&amp;amp;lt;Thrift Server&amp;amp;gt;]&lt;br /&gt;
    User[User&amp;amp;lt;Data Engineer&amp;amp;gt;]&lt;br /&gt;
    Spark[Apache Spark]&lt;br /&gt;
    Scheduler --2: trigger--&amp;gt; ETLE&lt;br /&gt;
    ETLE --3: git pull --&amp;gt;LC&lt;br /&gt;
    ETLE --4: dbt--&amp;gt; JDBC&lt;br /&gt;
    JDBC --5:--&amp;gt; Spark&lt;br /&gt;
    ER --&amp;gt; LC&lt;br /&gt;
    User --1: git push--&amp;gt;ER&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 1: User pushes ETL code into ETL Code Repo&lt;br /&gt;
* 2: Airflow Scheduler trigger DAG (DAG is generated based on metadata)&lt;br /&gt;
** The ETL job is a task within an airflow DAG&lt;br /&gt;
* 3: ETL executor pulls code from ETL Code Repo into loacl disk&lt;br /&gt;
* 4: ETL executor uses dbt library to submit job to Apache Spark via JDBC interface (e.g. via Thrift Server)&lt;br /&gt;
* 5: Thrift Server take the SQL and pass it to Apache Spark to execute&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= BI Connection =&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;Using MPP Engine&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
{{#mermaid:&lt;br /&gt;
graph TD&lt;br /&gt;
    subgraph storage&lt;br /&gt;
        GoldTier[Gold Tier]&lt;br /&gt;
        PlatniumTier[Platnium Tier]&lt;br /&gt;
    end&lt;br /&gt;
    JDBC[JDBC Interface]&lt;br /&gt;
    MPP[MPP Engine #40;Starburst Trino#41;]&lt;br /&gt;
    BI[BI Tool #40;Power BI#41;]&lt;br /&gt;
    GoldTier --&amp;gt; MPP&lt;br /&gt;
    PlatniumTier --&amp;gt; MPP&lt;br /&gt;
    MPP --&amp;gt; JDBC --&amp;gt; BI&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* BI Tool to access Gold Tier data and Platnium Tier data via JDBC interface exposed by a MPP engine&lt;br /&gt;
** Why? A MPP Engine provide better interactive SQL query speed than Spark Thrift Server&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Stonezhong</name></author>
	</entry>
	<entry>
		<id>https://home.stonezhong.net/index.php?title=Dl/Overview&amp;diff=453</id>
		<title>Dl/Overview</title>
		<link rel="alternate" type="text/html" href="https://home.stonezhong.net/index.php?title=Dl/Overview&amp;diff=453"/>
		<updated>2025-11-25T18:54:09Z</updated>

		<summary type="html">&lt;p&gt;Stonezhong: /* BI Connection */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;p&amp;gt;[[dl/home|Data Lake Knowledge Center]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ETL =&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;ETL Flow&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
{{#mermaid:&lt;br /&gt;
graph TD&lt;br /&gt;
    Scheduler[Apache Airflow/Scheduler]&lt;br /&gt;
    ETLE[ETL Executor&amp;amp;lt;Airflow Task&amp;amp;gt;]&lt;br /&gt;
    LC[Local ETL Code]&lt;br /&gt;
    ER[ETL Code Repo]&lt;br /&gt;
    JDBC[JDBC&amp;amp;lt;Thrift Server&amp;amp;gt;]&lt;br /&gt;
    User[User&amp;amp;lt;Data Engineer&amp;amp;gt;]&lt;br /&gt;
    Spark[Apache Spark]&lt;br /&gt;
    Scheduler --2: trigger--&amp;gt; ETLE&lt;br /&gt;
    ETLE --3: git pull --&amp;gt;LC&lt;br /&gt;
    ETLE --4: dbt--&amp;gt; JDBC&lt;br /&gt;
    JDBC --5:--&amp;gt; Spark&lt;br /&gt;
    ER --&amp;gt; LC&lt;br /&gt;
    User --1: git push--&amp;gt;ER&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 1: User pushes ETL code into ETL Code Repo&lt;br /&gt;
* 2: Airflow Scheduler trigger DAG (DAG is generated based on metadata)&lt;br /&gt;
** The ETL job is a task within an airflow DAG&lt;br /&gt;
* 3: ETL executor pulls code from ETL Code Repo into loacl disk&lt;br /&gt;
* 4: ETL executor uses dbt library to submit job to Apache Spark via JDBC interface (e.g. via Thrift Server)&lt;br /&gt;
* 5: Thrift Server take the SQL and pass it to Apache Spark to execute&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= BI Connection =&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;ETL Flow&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
{{#mermaid:&lt;br /&gt;
graph TD&lt;br /&gt;
    subgraph storage&lt;br /&gt;
        GoldTier[Gold Tier]&lt;br /&gt;
        PlatniumTier[Platnium Tier]&lt;br /&gt;
    end&lt;br /&gt;
    JDBC[JDBC Interface]&lt;br /&gt;
    MPP[MPP Engine #40;Starburst Trino#41;]&lt;br /&gt;
    BI[BI Tool #40;Power BI#41;]&lt;br /&gt;
    GoldTier --&amp;gt; MPP&lt;br /&gt;
    PlatniumTier --&amp;gt; MPP&lt;br /&gt;
    MPP --&amp;gt; JDBC --&amp;gt; BI&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* BI Tool to access Gold Tier data and Platnium Tier data via JDBC interface exposed by a MPP engine&lt;br /&gt;
** Why? A MPP Engine provide better interactive SQL query speed than Spark Thrift Server&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Stonezhong</name></author>
	</entry>
	<entry>
		<id>https://home.stonezhong.net/index.php?title=Dl/Overview&amp;diff=452</id>
		<title>Dl/Overview</title>
		<link rel="alternate" type="text/html" href="https://home.stonezhong.net/index.php?title=Dl/Overview&amp;diff=452"/>
		<updated>2025-11-25T18:53:22Z</updated>

		<summary type="html">&lt;p&gt;Stonezhong: /* BI Connection */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;p&amp;gt;[[dl/home|Data Lake Knowledge Center]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ETL =&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;ETL Flow&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
{{#mermaid:&lt;br /&gt;
graph TD&lt;br /&gt;
    Scheduler[Apache Airflow/Scheduler]&lt;br /&gt;
    ETLE[ETL Executor&amp;amp;lt;Airflow Task&amp;amp;gt;]&lt;br /&gt;
    LC[Local ETL Code]&lt;br /&gt;
    ER[ETL Code Repo]&lt;br /&gt;
    JDBC[JDBC&amp;amp;lt;Thrift Server&amp;amp;gt;]&lt;br /&gt;
    User[User&amp;amp;lt;Data Engineer&amp;amp;gt;]&lt;br /&gt;
    Spark[Apache Spark]&lt;br /&gt;
    Scheduler --2: trigger--&amp;gt; ETLE&lt;br /&gt;
    ETLE --3: git pull --&amp;gt;LC&lt;br /&gt;
    ETLE --4: dbt--&amp;gt; JDBC&lt;br /&gt;
    JDBC --5:--&amp;gt; Spark&lt;br /&gt;
    ER --&amp;gt; LC&lt;br /&gt;
    User --1: git push--&amp;gt;ER&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 1: User pushes ETL code into ETL Code Repo&lt;br /&gt;
* 2: Airflow Scheduler trigger DAG (DAG is generated based on metadata)&lt;br /&gt;
** The ETL job is a task within an airflow DAG&lt;br /&gt;
* 3: ETL executor pulls code from ETL Code Repo into loacl disk&lt;br /&gt;
* 4: ETL executor uses dbt library to submit job to Apache Spark via JDBC interface (e.g. via Thrift Server)&lt;br /&gt;
* 5: Thrift Server take the SQL and pass it to Apache Spark to execute&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= BI Connection =&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;ETL Flow&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
{{#mermaid:&lt;br /&gt;
graph TD&lt;br /&gt;
    subgraph storage&lt;br /&gt;
        GoldTier[Gold Tier]&lt;br /&gt;
        PlatniumTier[Platnium Tier]&lt;br /&gt;
    end&lt;br /&gt;
    MPP[MPP Engine #40;Starburst Trino#41;]&lt;br /&gt;
    BI[BI Tool #40;Power BI#41;]&lt;br /&gt;
    GoldTier --&amp;gt; MPP&lt;br /&gt;
    PlatniumTier --&amp;gt; MPP&lt;br /&gt;
    MPP --&amp;gt; BI&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* BI Tool to access Gold Tier data and Platnium Tier data via JDBC interface exposed by a MPP engine&lt;br /&gt;
** Why? A MPP Engine provide better interactive SQL query speed than Spark Thrift Server&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Stonezhong</name></author>
	</entry>
	<entry>
		<id>https://home.stonezhong.net/index.php?title=Dl/Overview&amp;diff=451</id>
		<title>Dl/Overview</title>
		<link rel="alternate" type="text/html" href="https://home.stonezhong.net/index.php?title=Dl/Overview&amp;diff=451"/>
		<updated>2025-11-25T18:43:44Z</updated>

		<summary type="html">&lt;p&gt;Stonezhong: /* ETL */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;p&amp;gt;[[dl/home|Data Lake Knowledge Center]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ETL =&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;ETL Flow&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
{{#mermaid:&lt;br /&gt;
graph TD&lt;br /&gt;
    Scheduler[Apache Airflow/Scheduler]&lt;br /&gt;
    ETLE[ETL Executor&amp;amp;lt;Airflow Task&amp;amp;gt;]&lt;br /&gt;
    LC[Local ETL Code]&lt;br /&gt;
    ER[ETL Code Repo]&lt;br /&gt;
    JDBC[JDBC&amp;amp;lt;Thrift Server&amp;amp;gt;]&lt;br /&gt;
    User[User&amp;amp;lt;Data Engineer&amp;amp;gt;]&lt;br /&gt;
    Spark[Apache Spark]&lt;br /&gt;
    Scheduler --2: trigger--&amp;gt; ETLE&lt;br /&gt;
    ETLE --3: git pull --&amp;gt;LC&lt;br /&gt;
    ETLE --4: dbt--&amp;gt; JDBC&lt;br /&gt;
    JDBC --5:--&amp;gt; Spark&lt;br /&gt;
    ER --&amp;gt; LC&lt;br /&gt;
    User --1: git push--&amp;gt;ER&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 1: User pushes ETL code into ETL Code Repo&lt;br /&gt;
* 2: Airflow Scheduler trigger DAG (DAG is generated based on metadata)&lt;br /&gt;
** The ETL job is a task within an airflow DAG&lt;br /&gt;
* 3: ETL executor pulls code from ETL Code Repo into loacl disk&lt;br /&gt;
* 4: ETL executor uses dbt library to submit job to Apache Spark via JDBC interface (e.g. via Thrift Server)&lt;br /&gt;
* 5: Thrift Server take the SQL and pass it to Apache Spark to execute&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= BI Connection =&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;ETL Flow&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
{{#mermaid:&lt;br /&gt;
graph TD&lt;br /&gt;
    Scheduler[Apache Airflow/Scheduler]&lt;br /&gt;
    ETLE[ETL Executor&amp;amp;lt;Airflow Task&amp;amp;gt;]&lt;br /&gt;
    LC[Local ETL Code]&lt;br /&gt;
    ER[ETL Code Repo]&lt;br /&gt;
    JDBC[JDBC&amp;amp;lt;Thrift Server&amp;amp;gt;]&lt;br /&gt;
    User[User&amp;amp;lt;Data Engineer&amp;amp;gt;]&lt;br /&gt;
    Spark[Apache Spark]&lt;br /&gt;
    Scheduler --2: trigger--&amp;gt; ETLE&lt;br /&gt;
    ETLE --3: git pull --&amp;gt;LC&lt;br /&gt;
    ETLE --4: dbt--&amp;gt; JDBC&lt;br /&gt;
    JDBC --5:--&amp;gt; Spark&lt;br /&gt;
    ER --&amp;gt; LC&lt;br /&gt;
    User --1: git push--&amp;gt;ER&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 1: User pushes ETL code into ETL Code Repo&lt;br /&gt;
* 2: Airflow Scheduler trigger DAG (DAG is generated based on metadata)&lt;br /&gt;
** The ETL job is a task within an airflow DAG&lt;br /&gt;
* 3: ETL executor pulls code from ETL Code Repo into loacl disk&lt;br /&gt;
* 4: ETL executor uses dbt library to submit job to Apache Spark via JDBC interface (e.g. via Thrift Server)&lt;br /&gt;
* 5: Thrift Server take the SQL and pass it to Apache Spark to execute&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Stonezhong</name></author>
	</entry>
	<entry>
		<id>https://home.stonezhong.net/index.php?title=Dl/Overview&amp;diff=450</id>
		<title>Dl/Overview</title>
		<link rel="alternate" type="text/html" href="https://home.stonezhong.net/index.php?title=Dl/Overview&amp;diff=450"/>
		<updated>2025-11-25T18:05:16Z</updated>

		<summary type="html">&lt;p&gt;Stonezhong: /* ETL */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;p&amp;gt;[[dl/home|Data Lake Knowledge Center]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ETL =&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;ETL Flow&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
{{#mermaid:&lt;br /&gt;
graph TD&lt;br /&gt;
    Scheduler[Apache Airflow/Scheduler]&lt;br /&gt;
    ETLE[ETL Executor&amp;amp;lt;Airflow Task&amp;amp;gt;]&lt;br /&gt;
    LC[Local ETL Code]&lt;br /&gt;
    ER[ETL Code Repo]&lt;br /&gt;
    JDBC[JDBC&amp;amp;lt;Thrift Server&amp;amp;gt;]&lt;br /&gt;
    User[User&amp;amp;lt;Data Engineer&amp;amp;gt;]&lt;br /&gt;
    Spark[Apache Spark]&lt;br /&gt;
    Scheduler --2: trigger--&amp;gt; ETLE&lt;br /&gt;
    ETLE --3: git pull --&amp;gt;LC&lt;br /&gt;
    ETLE --4: dbt--&amp;gt; JDBC&lt;br /&gt;
    JDBC --5:--&amp;gt; Spark&lt;br /&gt;
    ER --&amp;gt; LC&lt;br /&gt;
    User --1: git push--&amp;gt;ER&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 1: User pushes ETL code into ETL Code Repo&lt;br /&gt;
* 2: Airflow Scheduler trigger DAG (DAG is generated based on metadata)&lt;br /&gt;
** The ETL job is a task within an airflow DAG&lt;br /&gt;
* 3: ETL executor pulls code from ETL Code Repo into loacl disk&lt;br /&gt;
* 4: ETL executor uses dbt library to submit job to Apache Spark via JDBC interface (e.g. via Thrift Server)&lt;br /&gt;
* 5: Thrift Server take the SQL and pass it to Apache Spark to execute&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Stonezhong</name></author>
	</entry>
	<entry>
		<id>https://home.stonezhong.net/index.php?title=Dl/Overview&amp;diff=449</id>
		<title>Dl/Overview</title>
		<link rel="alternate" type="text/html" href="https://home.stonezhong.net/index.php?title=Dl/Overview&amp;diff=449"/>
		<updated>2025-11-25T18:03:04Z</updated>

		<summary type="html">&lt;p&gt;Stonezhong: /* ETL */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;p&amp;gt;[[dl/home|Data Lake Knowledge Center]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ETL =&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;ETL Flow&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
{{#mermaid:&lt;br /&gt;
graph TD&lt;br /&gt;
    Scheduler[Apache Airflow/Scheduler]&lt;br /&gt;
    ETLE[ETL Executor&amp;amp;lt;Airflow Task&amp;amp;gt;]&lt;br /&gt;
    LC[Local ETL Code]&lt;br /&gt;
    ER[ETL Code Repo]&lt;br /&gt;
    JDBC[JDBC&amp;amp;lt;Thrift Server&amp;amp;gt;]&lt;br /&gt;
    User[User&amp;amp;lt;Data Engineer&amp;amp;gt;]&lt;br /&gt;
    Spark[Apache Spark]&lt;br /&gt;
    Scheduler --1 trigger--&amp;gt; ETLE&lt;br /&gt;
    ETLE --2 git pull --&amp;gt;LC&lt;br /&gt;
    ETLE --3 dbt--&amp;gt; JDBC&lt;br /&gt;
    JDBC --4--&amp;gt; Spark&lt;br /&gt;
    ER --&amp;gt; LC&lt;br /&gt;
    User --5 git push--&amp;gt;ER&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 1 Airflow Scheduler trigger DAG (DAG is generated based on metadata)&lt;br /&gt;
** The ETL job is a task within an airflow DAG&lt;br /&gt;
* 2 ETL executor pulls code from a repo into loacl disk&lt;br /&gt;
* 3 ETL executor uses dbt library to submit job to Apache Spark via JDBC interface (e.g. via Thrift Server)&lt;br /&gt;
* 4 Thrift Server take the SQL and pass it to Apache Spark to execute&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Stonezhong</name></author>
	</entry>
	<entry>
		<id>https://home.stonezhong.net/index.php?title=Dl/Overview&amp;diff=448</id>
		<title>Dl/Overview</title>
		<link rel="alternate" type="text/html" href="https://home.stonezhong.net/index.php?title=Dl/Overview&amp;diff=448"/>
		<updated>2025-11-25T18:02:41Z</updated>

		<summary type="html">&lt;p&gt;Stonezhong: /* ETL */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;p&amp;gt;[[dl/home|Data Lake Knowledge Center]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ETL =&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;ETL Flow&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
{{#mermaid:&lt;br /&gt;
graph TD&lt;br /&gt;
    Scheduler[Apache Airflow/Scheduler]&lt;br /&gt;
    ETLE[ETL Executor&amp;amp;lt;Airflow Task&amp;amp;gt;]&lt;br /&gt;
    LC[Local ETL Code]&lt;br /&gt;
    ER[ETL Code Repo]&lt;br /&gt;
    JDBC[JDBC&amp;amp;lt;Thrift Server&amp;amp;gt;]&lt;br /&gt;
    User[User&amp;amp;lt;Data Engineer&amp;amp;gt;]&lt;br /&gt;
    Spark[Apache Spark]&lt;br /&gt;
    Scheduler --1 trigger--&amp;gt; ETLE&lt;br /&gt;
    ETLE --2 git pull --&amp;gt;LC&lt;br /&gt;
    ETLE --3 dbt--&amp;gt; JDBC&lt;br /&gt;
    JDBC --4--&amp;gt; Spark&lt;br /&gt;
    ER --&amp;gt; LC&lt;br /&gt;
    USER --5 git push--&amp;gt;ER&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 1 Airflow Scheduler trigger DAG (DAG is generated based on metadata)&lt;br /&gt;
** The ETL job is a task within an airflow DAG&lt;br /&gt;
* 2 ETL executor pulls code from a repo into loacl disk&lt;br /&gt;
* 3 ETL executor uses dbt library to submit job to Apache Spark via JDBC interface (e.g. via Thrift Server)&lt;br /&gt;
* 4 Thrift Server take the SQL and pass it to Apache Spark to execute&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Stonezhong</name></author>
	</entry>
	<entry>
		<id>https://home.stonezhong.net/index.php?title=Dl/Overview&amp;diff=447</id>
		<title>Dl/Overview</title>
		<link rel="alternate" type="text/html" href="https://home.stonezhong.net/index.php?title=Dl/Overview&amp;diff=447"/>
		<updated>2025-11-25T18:02:05Z</updated>

		<summary type="html">&lt;p&gt;Stonezhong: /* ETL */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;p&amp;gt;[[dl/home|Data Lake Knowledge Center]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ETL =&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;ETL Flow&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable grid mono section&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Diagram&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|{{#mermaid:&lt;br /&gt;
graph TD&lt;br /&gt;
    Scheduler[Apache Airflow/Scheduler]&lt;br /&gt;
    ETLE[ETL Executor&amp;amp;lt;Airflow Task&amp;amp;gt;]&lt;br /&gt;
    LC[Local ETL Code]&lt;br /&gt;
    ER[ETL Code Repo]&lt;br /&gt;
    JDBC[JDBC&amp;amp;lt;Thrift Server&amp;amp;gt;]&lt;br /&gt;
    User[User&amp;amp;lt;Data Engineer&amp;amp;gt;]&lt;br /&gt;
    Spark[Apache Spark]&lt;br /&gt;
    Scheduler --1 trigger--&amp;gt; ETLE&lt;br /&gt;
    ETLE --2 git pull --&amp;gt;LC&lt;br /&gt;
    ETLE --3 dbt--&amp;gt; JDBC&lt;br /&gt;
    JDBC --4--&amp;gt; Spark&lt;br /&gt;
    ER --&amp;gt; LC&lt;br /&gt;
    USER --5 git push--&amp;gt;ER&lt;br /&gt;
}}&lt;br /&gt;
| style=&amp;quot;vertical-align:top;&amp;quot; |&lt;br /&gt;
* 1 Airflow Scheduler trigger DAG (DAG is generated based on metadata)&lt;br /&gt;
** The ETL job is a task within an airflow DAG&lt;br /&gt;
* 2 ETL executor pulls code from a repo into loacl disk&lt;br /&gt;
* 3 ETL executor uses dbt library to submit job to Apache Spark via JDBC interface (e.g. via Thrift Server)&lt;br /&gt;
* 4 Thrift Server take the SQL and pass it to Apache Spark to execute&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Stonezhong</name></author>
	</entry>
	<entry>
		<id>https://home.stonezhong.net/index.php?title=Dl/Overview&amp;diff=446</id>
		<title>Dl/Overview</title>
		<link rel="alternate" type="text/html" href="https://home.stonezhong.net/index.php?title=Dl/Overview&amp;diff=446"/>
		<updated>2025-11-25T18:00:14Z</updated>

		<summary type="html">&lt;p&gt;Stonezhong: /* ETL */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;p&amp;gt;[[dl/home|Data Lake Knowledge Center]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ETL =&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;ETL Flow&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable grid mono section&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Diagram&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|{{#mermaid:&lt;br /&gt;
graph TD&lt;br /&gt;
    Scheduler[Apache Airflow/Scheduler]&lt;br /&gt;
    ETLE[ETL Executor&amp;amp;lt;Airflow Task&amp;amp;gt;]&lt;br /&gt;
    LC[Local ETL Code]&lt;br /&gt;
    ER[ETL Code Repo]&lt;br /&gt;
    JDBC[JDBC&amp;amp;lt;Thrift Server&amp;amp;gt;]&lt;br /&gt;
    Spark[Apache Spark]&lt;br /&gt;
    Scheduler --1 trigger--&amp;gt; ETLE&lt;br /&gt;
    ETLE --2 git pull --&amp;gt;LC&lt;br /&gt;
    ETLE --3 dbt--&amp;gt; JDBC&lt;br /&gt;
    JDBC --4--&amp;gt; Spark&lt;br /&gt;
    ER --&amp;gt; LC&lt;br /&gt;
}}&lt;br /&gt;
| style=&amp;quot;vertical-align:top;&amp;quot; |&lt;br /&gt;
* 1 Airflow Scheduler trigger DAG (DAG is generated based on metadata)&lt;br /&gt;
** The ETL job is a task within an airflow DAG&lt;br /&gt;
* 2 ETL executor pulls code from a repo into loacl disk&lt;br /&gt;
* 3 ETL executor uses dbt library to submit job to Apache Spark via JDBC interface (e.g. via Thrift Server)&lt;br /&gt;
* 4 Thrift Server take the SQL and pass it to Apache Spark to execute&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Stonezhong</name></author>
	</entry>
	<entry>
		<id>https://home.stonezhong.net/index.php?title=Dl/Overview&amp;diff=445</id>
		<title>Dl/Overview</title>
		<link rel="alternate" type="text/html" href="https://home.stonezhong.net/index.php?title=Dl/Overview&amp;diff=445"/>
		<updated>2025-11-25T17:58:06Z</updated>

		<summary type="html">&lt;p&gt;Stonezhong: /* Purpose */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;p&amp;gt;[[dl/home|Data Lake Knowledge Center]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ETL =&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;ETL Flow&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable grid mono section&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Diagram&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|{{#mermaid:&lt;br /&gt;
graph TD&lt;br /&gt;
    Scheduler[Apache Airflow/Scheduler]&lt;br /&gt;
    ETLE[ETL Executor&amp;amp;lt;Airflow Task&amp;amp;gt;]&lt;br /&gt;
    LC[Local Code]&lt;br /&gt;
    JDBC[JDBC&amp;amp;lt;Thrift Server&amp;amp;gt;]&lt;br /&gt;
    Spark[Apache Spark]&lt;br /&gt;
    Scheduler --1 trigger--&amp;gt; ETLE&lt;br /&gt;
    ETLE --2 git pull --&amp;gt;LC&lt;br /&gt;
    ETLE --3 dbt--&amp;gt; JDBC&lt;br /&gt;
    JDBC --4--&amp;gt; Spark&lt;br /&gt;
}}&lt;br /&gt;
| style=&amp;quot;vertical-align:top;&amp;quot; |&lt;br /&gt;
* 1 Airflow Scheduler trigger DAG (DAG is generated based on metadata)&lt;br /&gt;
** The ETL job is a task within an airflow DAG&lt;br /&gt;
* 2 ETL executor pulls code from a repo into loacl disk&lt;br /&gt;
* 3 ETL executor uses dbt library to submit job to Apache Spark via JDBC interface (e.g. via Thrift Server)&lt;br /&gt;
* 4 Thrift Server take the SQL and pass it to Apache Spark to execute&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Stonezhong</name></author>
	</entry>
	<entry>
		<id>https://home.stonezhong.net/index.php?title=Dl/Overview&amp;diff=444</id>
		<title>Dl/Overview</title>
		<link rel="alternate" type="text/html" href="https://home.stonezhong.net/index.php?title=Dl/Overview&amp;diff=444"/>
		<updated>2025-11-25T17:57:05Z</updated>

		<summary type="html">&lt;p&gt;Stonezhong: /* Overview */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;p&amp;gt;[[dl/home|Data Lake Knowledge Center]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Purpose =&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;ETL Flow&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable grid mono section&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Diagram&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|{{#mermaid:&lt;br /&gt;
graph TD&lt;br /&gt;
    Scheduler[Apache Airflow/Scheduler]&lt;br /&gt;
    ETLE[ETL Executor&amp;amp;lt;Airflow Task&amp;amp;gt;]&lt;br /&gt;
    LC[Local Code]&lt;br /&gt;
    JDBC[JDBC&amp;amp;lt;Thrift Server&amp;amp;gt;]&lt;br /&gt;
    Spark[Apache Spark]&lt;br /&gt;
    Scheduler --1 trigger--&amp;gt; ETLE&lt;br /&gt;
    ETLE --2 git pull --&amp;gt;LC&lt;br /&gt;
    ETLE --3 dbt--&amp;gt; JDBC&lt;br /&gt;
    JDBC --4--&amp;gt; Spark&lt;br /&gt;
}}&lt;br /&gt;
| style=&amp;quot;vertical-align:top;&amp;quot; |&lt;br /&gt;
* 1 Airflow Scheduler trigger DAG (DAG is generated based on metadata)&lt;br /&gt;
** The ETL job is a task within an airflow DAG&lt;br /&gt;
* 2 ETL executor pulls code from a repo into loacl disk&lt;br /&gt;
* 3 ETL executor uses dbt library to submit job to Apache Spark via JDBC interface (e.g. via Thrift Server)&lt;br /&gt;
* 4 Thrift Server take the SQL and pass it to Apache Spark to execute&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Stonezhong</name></author>
	</entry>
	<entry>
		<id>https://home.stonezhong.net/index.php?title=Dl/Overview&amp;diff=443</id>
		<title>Dl/Overview</title>
		<link rel="alternate" type="text/html" href="https://home.stonezhong.net/index.php?title=Dl/Overview&amp;diff=443"/>
		<updated>2025-11-25T17:55:16Z</updated>

		<summary type="html">&lt;p&gt;Stonezhong: /* Overview */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;p&amp;gt;[[dl/home|Data Lake Knowledge Center]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
{| class=&amp;quot;wikitable grid mono section&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Diagram&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|{{#mermaid:&lt;br /&gt;
graph TD&lt;br /&gt;
    Scheduler[Apache Airflow/Scheduler]&lt;br /&gt;
    ETLE[ETL Executor&amp;amp;lt;Airflow Task&amp;amp;gt;]&lt;br /&gt;
    LC[Local Code]&lt;br /&gt;
    JDBC[JDBC&amp;amp;lt;Thrift Server&amp;amp;gt;]&lt;br /&gt;
    Spark[Apache Spark]&lt;br /&gt;
    Scheduler --1 trigger--&amp;gt; ETLE&lt;br /&gt;
    ETLE --2 git pull --&amp;gt;LC&lt;br /&gt;
    ETLE --3 dbt--&amp;gt; JDBC&lt;br /&gt;
    JDBC --4--&amp;gt; Spark&lt;br /&gt;
}}&lt;br /&gt;
| style=&amp;quot;vertical-align:top;&amp;quot; |&lt;br /&gt;
* 1 Airflow Scheduler trigger DAG (DAG is generated based on metadata)&lt;br /&gt;
** The ETL job is a task within an airflow DAG&lt;br /&gt;
* 2 ETL executor pulls code from a repo into loacl disk&lt;br /&gt;
* 3 ETL executor uses dbt library to submit job to Apache Spark via JDBC interface (e.g. via Thrift Server)&lt;br /&gt;
* 4 Thrift Server take the SQL and pass it to Apache Spark to execute&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Stonezhong</name></author>
	</entry>
	<entry>
		<id>https://home.stonezhong.net/index.php?title=Dl/Overview&amp;diff=442</id>
		<title>Dl/Overview</title>
		<link rel="alternate" type="text/html" href="https://home.stonezhong.net/index.php?title=Dl/Overview&amp;diff=442"/>
		<updated>2025-11-25T17:53:14Z</updated>

		<summary type="html">&lt;p&gt;Stonezhong: /* Overview */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;p&amp;gt;[[dl/home|Data Lake Knowledge Center]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
{| class=&amp;quot;wikitable grid mono section&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Diagram&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|{{#mermaid:&lt;br /&gt;
graph TD&lt;br /&gt;
    Scheduler[Apache Airflow/Scheduler]&lt;br /&gt;
    ETLE[ETL Executor&amp;amp;lt;Airflow Task&amp;amp;gt;]&lt;br /&gt;
    LC[Local Code]&lt;br /&gt;
    JDBC[JDBC&amp;amp;lt;Thrift Server&amp;amp;gt;]&lt;br /&gt;
    Spark[Apache Spark]&lt;br /&gt;
    Scheduler --1 trigger--&amp;gt; ETLE&lt;br /&gt;
    ETLE --2 git pull --&amp;gt;LC&lt;br /&gt;
    ETLE --3 dbt--&amp;gt; JDBC&lt;br /&gt;
    JDBC --&amp;gt; Spark&lt;br /&gt;
}}&lt;br /&gt;
| style=&amp;quot;vertical-align:top;&amp;quot; |&lt;br /&gt;
* 1 Airflow Scheduler trigger DAG (DAG is generated based on metadata)&lt;br /&gt;
** The ETL job is a task within an airflow DAG&lt;br /&gt;
* 2 ETL executor pulls code from a repo into loacl disk&lt;br /&gt;
* 3 ETL executor uses dbt library to submit job to Apache Spark via JDBC interface (e.g. via Thrift Server)&lt;br /&gt;
* 4 Thrift Server take the SQL and pass it to Apache Spark to execute&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Stonezhong</name></author>
	</entry>
	<entry>
		<id>https://home.stonezhong.net/index.php?title=Dl/Overview&amp;diff=441</id>
		<title>Dl/Overview</title>
		<link rel="alternate" type="text/html" href="https://home.stonezhong.net/index.php?title=Dl/Overview&amp;diff=441"/>
		<updated>2025-11-25T17:31:50Z</updated>

		<summary type="html">&lt;p&gt;Stonezhong: Created page with &amp;quot;&amp;lt;p&amp;gt;Data Lake Knowledge Center&amp;lt;/p&amp;gt;  = Overview = {{#mermaid: graph TD     Scheduler[Apache Scheduler]     ETLE[ETL Executor]     CR[Code Repo]     Spark[Apache Spark]      }}&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;p&amp;gt;[[dl/home|Data Lake Knowledge Center]]&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
{{#mermaid:&lt;br /&gt;
graph TD&lt;br /&gt;
    Scheduler[Apache Scheduler]&lt;br /&gt;
    ETLE[ETL Executor]&lt;br /&gt;
    CR[Code Repo]&lt;br /&gt;
    Spark[Apache Spark]&lt;br /&gt;
    &lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Stonezhong</name></author>
	</entry>
	<entry>
		<id>https://home.stonezhong.net/index.php?title=Dl/home&amp;diff=440</id>
		<title>Dl/home</title>
		<link rel="alternate" type="text/html" href="https://home.stonezhong.net/index.php?title=Dl/home&amp;diff=440"/>
		<updated>2025-11-25T17:22:40Z</updated>

		<summary type="html">&lt;p&gt;Stonezhong: /* Data Tiers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= [[dl/DataTiers|Data Tiers]] =&lt;br /&gt;
= [[dl/Overview|Overview]] =&lt;br /&gt;
&lt;br /&gt;
= [[dl/Models|Models]] =&lt;br /&gt;
= [[dl/DatasetRepository|Dataset Repository]] =&lt;br /&gt;
= [[dl/DataApplication|Data Application]] =&lt;br /&gt;
= [[dl/devops|devops]] =&lt;br /&gt;
= [[dl/sprint|sprint]] =&lt;br /&gt;
= [[dl/glossary|Glossary]] =&lt;br /&gt;
= [[dl/Notes|Notes]] =&lt;br /&gt;
= [[dl/Product Release Checklist|Product Release Checklist]] =&lt;br /&gt;
= [[dl/Best Practices|Best Practices]] =&lt;/div&gt;</summary>
		<author><name>Stonezhong</name></author>
	</entry>
	<entry>
		<id>https://home.stonezhong.net/index.php?title=Dl/Models&amp;diff=436</id>
		<title>Dl/Models</title>
		<link rel="alternate" type="text/html" href="https://home.stonezhong.net/index.php?title=Dl/Models&amp;diff=436"/>
		<updated>2025-11-25T03:15:18Z</updated>

		<summary type="html">&lt;p&gt;Stonezhong: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introduction =&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;Introduction&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Models =&lt;br /&gt;
== [[dl/Dataset|Dataset]] ==&lt;br /&gt;
== [[dl/DataUnit|Data Unit]] ==&lt;br /&gt;
&lt;br /&gt;
== [[dl/DataLocation|Data Location]] ==&lt;br /&gt;
&lt;br /&gt;
== [[dl/DataType|Data Type]] ==&lt;/div&gt;</summary>
		<author><name>Stonezhong</name></author>
	</entry>
	<entry>
		<id>https://home.stonezhong.net/index.php?title=Dl/Models&amp;diff=435</id>
		<title>Dl/Models</title>
		<link rel="alternate" type="text/html" href="https://home.stonezhong.net/index.php?title=Dl/Models&amp;diff=435"/>
		<updated>2025-11-25T03:14:30Z</updated>

		<summary type="html">&lt;p&gt;Stonezhong: /* Overview */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introduction =&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;Introduction&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
{| class=&amp;quot;wikitable grid mono section&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Diagram&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
{{#mermaid:&lt;br /&gt;
graph TD&lt;br /&gt;
    BornzeTier[Bronze Tier]&lt;br /&gt;
    SilverTier[Silver Tier]&lt;br /&gt;
    GoldTier[Gold Tier]&lt;br /&gt;
    PlatniumTier[Platnium Tier]&lt;br /&gt;
    ExternalData[External Data]&lt;br /&gt;
&lt;br /&gt;
    ExternalData --ingestion--&amp;gt; BornzeTier --ingestion--&amp;gt; SilverTier --ETL--&amp;gt; GoldTier --ETL--&amp;gt; PlatniumTier&lt;br /&gt;
}}&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;Bronze Tier&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;:&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;The purpose for bronze tier is to store data downloaded from external world into data lake so we can use all sort of tools inside data lake to further process it&amp;lt;/b&amp;gt;&lt;br /&gt;
* raw data&lt;br /&gt;
* no uniformed format, could be csv, JSON, AVRO, parquet, binary, anything&lt;br /&gt;
* could even be unstructured&lt;br /&gt;
* no data quality assurance&lt;br /&gt;
&amp;lt;hr /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;Silver Tier&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;:&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;The purpose for bronze tier is to allow data ingestion application to sanitize data, verify the quality of the data&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Data quality is assurred&lt;br /&gt;
* Data may not be normalized. One table may use UTC for a timestamp column while aother table may use timestamp without timezone. No stadnardlization for column name.&lt;br /&gt;
* Data format is uniformed, usually it is stored as a format that is best fits the further ETL process, for example parquet.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;Gold Tier&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;:&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Tables for star schema&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* dimention tables and fact tables that forms star schema&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;Platinum Tier&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;:&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Various query result for specific business questions materized in tables&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Various query result for specific business questions materized in tables&lt;br /&gt;
* Tables may be replicated to a RDBMS for BI tool to access (sometime you can expose them directly, e.g. Spark Thrift Server)&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Models =&lt;br /&gt;
== [[dl/Dataset|Dataset]] ==&lt;br /&gt;
== [[dl/DataUnit|Data Unit]] ==&lt;br /&gt;
&lt;br /&gt;
== [[dl/DataLocation|Data Location]] ==&lt;br /&gt;
&lt;br /&gt;
== [[dl/DataType|Data Type]] ==&lt;/div&gt;</summary>
		<author><name>Stonezhong</name></author>
	</entry>
	<entry>
		<id>https://home.stonezhong.net/index.php?title=Dl/Models&amp;diff=434</id>
		<title>Dl/Models</title>
		<link rel="alternate" type="text/html" href="https://home.stonezhong.net/index.php?title=Dl/Models&amp;diff=434"/>
		<updated>2025-11-25T03:09:29Z</updated>

		<summary type="html">&lt;p&gt;Stonezhong: /* Overview */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introduction =&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;Introduction&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
{| class=&amp;quot;wikitable grid mono section&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Diagram&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
{{#mermaid:&lt;br /&gt;
graph TD&lt;br /&gt;
    BornzeTier[Bronze Tier]&lt;br /&gt;
    SilverTier[Silver Tier]&lt;br /&gt;
    GoldTier[Gold Tier]&lt;br /&gt;
    PlatniumTier[Platnium Tier]&lt;br /&gt;
    ExternalData[External Data]&lt;br /&gt;
&lt;br /&gt;
    ExternalData --ingestion--&amp;gt; BornzeTier --ingestion--&amp;gt; SilverTier --ETL--&amp;gt; GoldTier --ETL--&amp;gt; PlatniumTier&lt;br /&gt;
}}&lt;br /&gt;
| &lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;Bronze Tier&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;:&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;The purpose for bronze tier is to store data downloaded from external world into data lake so we can use all sort of tools inside data lake to further process it&amp;lt;/b&amp;gt;&lt;br /&gt;
* raw data&lt;br /&gt;
* no uniformed format, could be csv, JSON, AVRO, parquet, binary, anything&lt;br /&gt;
* could even be unstructured&lt;br /&gt;
* no data quality assurance&lt;br /&gt;
&amp;lt;hr /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;b&amp;gt;Silver Tier&amp;lt;/b&amp;gt;&amp;lt;/big&amp;gt;:&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;The purpose for bronze tier is to allow data ingestion application to sanitize data, verify the quality of the data&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Data quality is assurred&lt;br /&gt;
* Data may not be normalized. One table may use UTC for a timestamp column while aother table may use timestamp without timezone. No stadnardlization for column name.&lt;br /&gt;
* Data format is uniformed, usually it is stored as a format that is best fits the further ETL process, for example parquet.&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Models =&lt;br /&gt;
== [[dl/Dataset|Dataset]] ==&lt;br /&gt;
== [[dl/DataUnit|Data Unit]] ==&lt;br /&gt;
&lt;br /&gt;
== [[dl/DataLocation|Data Location]] ==&lt;br /&gt;
&lt;br /&gt;
== [[dl/DataType|Data Type]] ==&lt;/div&gt;</summary>
		<author><name>Stonezhong</name></author>
	</entry>
	<entry>
		<id>https://home.stonezhong.net/index.php?title=Dl/Models&amp;diff=433</id>
		<title>Dl/Models</title>
		<link rel="alternate" type="text/html" href="https://home.stonezhong.net/index.php?title=Dl/Models&amp;diff=433"/>
		<updated>2025-11-25T02:52:48Z</updated>

		<summary type="html">&lt;p&gt;Stonezhong: /* Overview */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introduction =&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;Introduction&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
{| class=&amp;quot;wikitable grid mono section&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Diagram&lt;br /&gt;
! Description&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
{{#mermaid:&lt;br /&gt;
graph TD&lt;br /&gt;
    BornzeTier[Bronze Tier]&lt;br /&gt;
    SilverTier[Silver Tier]&lt;br /&gt;
    GoldTier[Gold Tier]&lt;br /&gt;
    PlatniumTier[Platnium Tier]&lt;br /&gt;
    ExternalData[External Data]&lt;br /&gt;
&lt;br /&gt;
    ExternalData --ingestion--&amp;gt; BornzeTier --ingestion--&amp;gt; SilverTier --ETL--&amp;gt; GoldTier --ETL--&amp;gt; PlatniumTier&lt;br /&gt;
}}&lt;br /&gt;
| &lt;br /&gt;
* Bronze Tier:&lt;br /&gt;
** raw data&lt;br /&gt;
** no uniformed format, could be csv, JSON, binary, anything&lt;br /&gt;
** could even be unstructured&lt;br /&gt;
** no data quality assurance&lt;br /&gt;
** Usually it is a place for data ingestion application to dump raw data downloaded from external world.&lt;br /&gt;
* Silver Tier:&lt;br /&gt;
** X&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Models =&lt;br /&gt;
== [[dl/Dataset|Dataset]] ==&lt;br /&gt;
== [[dl/DataUnit|Data Unit]] ==&lt;br /&gt;
&lt;br /&gt;
== [[dl/DataLocation|Data Location]] ==&lt;br /&gt;
&lt;br /&gt;
== [[dl/DataType|Data Type]] ==&lt;/div&gt;</summary>
		<author><name>Stonezhong</name></author>
	</entry>
	<entry>
		<id>https://home.stonezhong.net/index.php?title=Dl/Models&amp;diff=432</id>
		<title>Dl/Models</title>
		<link rel="alternate" type="text/html" href="https://home.stonezhong.net/index.php?title=Dl/Models&amp;diff=432"/>
		<updated>2025-11-25T02:37:30Z</updated>

		<summary type="html">&lt;p&gt;Stonezhong: /* Introduction */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introduction =&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;Introduction&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Overview =&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
{{#mermaid:&lt;br /&gt;
graph TD&lt;br /&gt;
    BornzeTier[Bronze Tier]&lt;br /&gt;
    SilverTier[Silver Tier]&lt;br /&gt;
    GoldTier[Gold Tier]&lt;br /&gt;
    PlatniumTier[Platnium Tier]&lt;br /&gt;
    ExternalData[External Data]&lt;br /&gt;
&lt;br /&gt;
    ExternalData --ingestion--&amp;gt; BornzeTier --ingestion--&amp;gt; SilverTier --ETL--&amp;gt; GoldTier --ETL--&amp;gt; PlatniumTier&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
= Models =&lt;br /&gt;
== [[dl/Dataset|Dataset]] ==&lt;br /&gt;
== [[dl/DataUnit|Data Unit]] ==&lt;br /&gt;
&lt;br /&gt;
== [[dl/DataLocation|Data Location]] ==&lt;br /&gt;
&lt;br /&gt;
== [[dl/DataType|Data Type]] ==&lt;/div&gt;</summary>
		<author><name>Stonezhong</name></author>
	</entry>
	<entry>
		<id>https://home.stonezhong.net/index.php?title=Dl/home&amp;diff=430</id>
		<title>Dl/home</title>
		<link rel="alternate" type="text/html" href="https://home.stonezhong.net/index.php?title=Dl/home&amp;diff=430"/>
		<updated>2025-11-25T02:27:47Z</updated>

		<summary type="html">&lt;p&gt;Stonezhong: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= [[dl/DataTiers|Data Tiers]] =&lt;br /&gt;
= [[dl/Models|Models]] =&lt;br /&gt;
= [[dl/DatasetRepository|Dataset Repository]] =&lt;br /&gt;
= [[dl/DataApplication|Data Application]] =&lt;br /&gt;
= [[dl/devops|devops]] =&lt;br /&gt;
= [[dl/sprint|sprint]] =&lt;br /&gt;
= [[dl/glossary|Glossary]] =&lt;br /&gt;
= [[dl/Notes|Notes]] =&lt;br /&gt;
= [[dl/Product Release Checklist|Product Release Checklist]] =&lt;br /&gt;
= [[dl/Best Practices|Best Practices]] =&lt;/div&gt;</summary>
		<author><name>Stonezhong</name></author>
	</entry>
	<entry>
		<id>https://home.stonezhong.net/index.php?title=About-wiki&amp;diff=429</id>
		<title>About-wiki</title>
		<link rel="alternate" type="text/html" href="https://home.stonezhong.net/index.php?title=About-wiki&amp;diff=429"/>
		<updated>2025-11-19T09:53:34Z</updated>

		<summary type="html">&lt;p&gt;Stonezhong: /* Mermaid */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Wiki Features =&lt;br /&gt;
== Global CSS ==&lt;br /&gt;
* [[MediaWiki:Common.css|Global CSS]]&lt;br /&gt;
&lt;br /&gt;
== You can use raw HTML tags ==&lt;br /&gt;
You can wrap your html content in &amp;lt;nowiki&amp;gt;&amp;lt;html&amp;gt;...&amp;lt;/html&amp;gt;&amp;lt;/nowiki&amp;gt;, for example, &lt;br /&gt;
&amp;lt;html&amp;gt;&amp;lt;div style=&amp;quot;background-color:green;&amp;quot;&amp;gt;hello&amp;lt;/div&amp;gt;&amp;lt;/html&amp;gt;&lt;br /&gt;
source code:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;html&amp;gt;&amp;lt;div style=&amp;quot;background-color:green;&amp;quot;&amp;gt;hello&amp;lt;/div&amp;gt;&amp;lt;/html&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== You can insert external images ==&lt;br /&gt;
=== method 1: use raw img tag ===&lt;br /&gt;
for example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html&amp;gt;&amp;lt;img src=&amp;quot;https://upload.wikimedia.org/wikipedia/commons/thumb/e/e1/FullMoon2010.jpg/220px-FullMoon2010.jpg&amp;quot; /&amp;gt;&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
source code:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&amp;lt;img src=&amp;quot;https://upload.wikimedia.org/wikipedia/commons/thumb/e/e1/FullMoon2010.jpg/220px-FullMoon2010.jpg&amp;quot; /&amp;gt;&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== method 2: use traditional wiki style ===&lt;br /&gt;
Example:&lt;br /&gt;
{|&lt;br /&gt;
| https://upload.wikimedia.org/wikipedia/commons/thumb/e/e1/FullMoon2010.jpg/220px-FullMoon2010.jpg&lt;br /&gt;
|-&lt;br /&gt;
| This is a picture&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
source code:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
{|&lt;br /&gt;
| https://upload.wikimedia.org/wikipedia/commons/thumb/e/e1/FullMoon2010.jpg/220px-FullMoon2010.jpg&lt;br /&gt;
|-&lt;br /&gt;
| This is a picture&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== insert youtube video ==&lt;br /&gt;
Insert raw html directly. example&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;iframe width=&amp;quot;560&amp;quot; height=&amp;quot;315&amp;quot; src=&amp;quot;https://www.youtube.com/embed/syp6Lsd8HOo&amp;quot; title=&amp;quot;YouTube video player&amp;quot; frameborder=&amp;quot;0&amp;quot; allow=&amp;quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&amp;quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
source code:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
&amp;lt;iframe width=&amp;quot;560&amp;quot; height=&amp;quot;315&amp;quot; src=&amp;quot;https://www.youtube.com/embed/syp6Lsd8HOo&amp;quot; title=&amp;quot;YouTube video player&amp;quot; frameborder=&amp;quot;0&amp;quot; allow=&amp;quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&amp;quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== expandable ==&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed mono expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
* [https://www.youtube.com/ youtube]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
source:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed mono expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
* [https://www.youtube.com/ youtube]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mermaid ==&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
{{#mermaid:&lt;br /&gt;
graph TD&lt;br /&gt;
    A[Start] --&amp;gt; B{Is Mermaid enabled?}&lt;br /&gt;
    B --&amp;gt;|Yes| C[Render diagram]&lt;br /&gt;
    B --&amp;gt;|No| D[Show code as text]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
source:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
{{#mermaid:&lt;br /&gt;
graph TD&lt;br /&gt;
    A[Start] --&amp;gt; B{Is Mermaid enabled?}&lt;br /&gt;
    B --&amp;gt;|Yes| C[Render diagram]&lt;br /&gt;
    B --&amp;gt;|No| D[Show code as text]&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Stonezhong</name></author>
	</entry>
	<entry>
		<id>https://home.stonezhong.net/index.php?title=About-wiki&amp;diff=428</id>
		<title>About-wiki</title>
		<link rel="alternate" type="text/html" href="https://home.stonezhong.net/index.php?title=About-wiki&amp;diff=428"/>
		<updated>2025-11-19T09:52:30Z</updated>

		<summary type="html">&lt;p&gt;Stonezhong: /* test */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Wiki Features =&lt;br /&gt;
== Global CSS ==&lt;br /&gt;
* [[MediaWiki:Common.css|Global CSS]]&lt;br /&gt;
&lt;br /&gt;
== You can use raw HTML tags ==&lt;br /&gt;
You can wrap your html content in &amp;lt;nowiki&amp;gt;&amp;lt;html&amp;gt;...&amp;lt;/html&amp;gt;&amp;lt;/nowiki&amp;gt;, for example, &lt;br /&gt;
&amp;lt;html&amp;gt;&amp;lt;div style=&amp;quot;background-color:green;&amp;quot;&amp;gt;hello&amp;lt;/div&amp;gt;&amp;lt;/html&amp;gt;&lt;br /&gt;
source code:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;html&amp;gt;&amp;lt;div style=&amp;quot;background-color:green;&amp;quot;&amp;gt;hello&amp;lt;/div&amp;gt;&amp;lt;/html&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== You can insert external images ==&lt;br /&gt;
=== method 1: use raw img tag ===&lt;br /&gt;
for example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html&amp;gt;&amp;lt;img src=&amp;quot;https://upload.wikimedia.org/wikipedia/commons/thumb/e/e1/FullMoon2010.jpg/220px-FullMoon2010.jpg&amp;quot; /&amp;gt;&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
source code:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&amp;lt;img src=&amp;quot;https://upload.wikimedia.org/wikipedia/commons/thumb/e/e1/FullMoon2010.jpg/220px-FullMoon2010.jpg&amp;quot; /&amp;gt;&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== method 2: use traditional wiki style ===&lt;br /&gt;
Example:&lt;br /&gt;
{|&lt;br /&gt;
| https://upload.wikimedia.org/wikipedia/commons/thumb/e/e1/FullMoon2010.jpg/220px-FullMoon2010.jpg&lt;br /&gt;
|-&lt;br /&gt;
| This is a picture&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
source code:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
{|&lt;br /&gt;
| https://upload.wikimedia.org/wikipedia/commons/thumb/e/e1/FullMoon2010.jpg/220px-FullMoon2010.jpg&lt;br /&gt;
|-&lt;br /&gt;
| This is a picture&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== insert youtube video ==&lt;br /&gt;
Insert raw html directly. example&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;iframe width=&amp;quot;560&amp;quot; height=&amp;quot;315&amp;quot; src=&amp;quot;https://www.youtube.com/embed/syp6Lsd8HOo&amp;quot; title=&amp;quot;YouTube video player&amp;quot; frameborder=&amp;quot;0&amp;quot; allow=&amp;quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&amp;quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
source code:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
&amp;lt;iframe width=&amp;quot;560&amp;quot; height=&amp;quot;315&amp;quot; src=&amp;quot;https://www.youtube.com/embed/syp6Lsd8HOo&amp;quot; title=&amp;quot;YouTube video player&amp;quot; frameborder=&amp;quot;0&amp;quot; allow=&amp;quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&amp;quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== expandable ==&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed mono expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
* [https://www.youtube.com/ youtube]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
source:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed mono expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
* [https://www.youtube.com/ youtube]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Mermaid ==&lt;br /&gt;
&lt;br /&gt;
{{#mermaid:&lt;br /&gt;
graph TD&lt;br /&gt;
    A[Start] --&amp;gt; B{Is Mermaid enabled?}&lt;br /&gt;
    B --&amp;gt;|Yes| C[Render diagram]&lt;br /&gt;
    B --&amp;gt;|No| D[Show code as text]&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Stonezhong</name></author>
	</entry>
	<entry>
		<id>https://home.stonezhong.net/index.php?title=About-wiki&amp;diff=427</id>
		<title>About-wiki</title>
		<link rel="alternate" type="text/html" href="https://home.stonezhong.net/index.php?title=About-wiki&amp;diff=427"/>
		<updated>2025-11-19T05:30:35Z</updated>

		<summary type="html">&lt;p&gt;Stonezhong: /* test */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Wiki Features =&lt;br /&gt;
== Global CSS ==&lt;br /&gt;
* [[MediaWiki:Common.css|Global CSS]]&lt;br /&gt;
&lt;br /&gt;
== You can use raw HTML tags ==&lt;br /&gt;
You can wrap your html content in &amp;lt;nowiki&amp;gt;&amp;lt;html&amp;gt;...&amp;lt;/html&amp;gt;&amp;lt;/nowiki&amp;gt;, for example, &lt;br /&gt;
&amp;lt;html&amp;gt;&amp;lt;div style=&amp;quot;background-color:green;&amp;quot;&amp;gt;hello&amp;lt;/div&amp;gt;&amp;lt;/html&amp;gt;&lt;br /&gt;
source code:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;html&amp;gt;&amp;lt;div style=&amp;quot;background-color:green;&amp;quot;&amp;gt;hello&amp;lt;/div&amp;gt;&amp;lt;/html&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== You can insert external images ==&lt;br /&gt;
=== method 1: use raw img tag ===&lt;br /&gt;
for example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html&amp;gt;&amp;lt;img src=&amp;quot;https://upload.wikimedia.org/wikipedia/commons/thumb/e/e1/FullMoon2010.jpg/220px-FullMoon2010.jpg&amp;quot; /&amp;gt;&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
source code:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&amp;lt;img src=&amp;quot;https://upload.wikimedia.org/wikipedia/commons/thumb/e/e1/FullMoon2010.jpg/220px-FullMoon2010.jpg&amp;quot; /&amp;gt;&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== method 2: use traditional wiki style ===&lt;br /&gt;
Example:&lt;br /&gt;
{|&lt;br /&gt;
| https://upload.wikimedia.org/wikipedia/commons/thumb/e/e1/FullMoon2010.jpg/220px-FullMoon2010.jpg&lt;br /&gt;
|-&lt;br /&gt;
| This is a picture&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
source code:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
{|&lt;br /&gt;
| https://upload.wikimedia.org/wikipedia/commons/thumb/e/e1/FullMoon2010.jpg/220px-FullMoon2010.jpg&lt;br /&gt;
|-&lt;br /&gt;
| This is a picture&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== insert youtube video ==&lt;br /&gt;
Insert raw html directly. example&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;iframe width=&amp;quot;560&amp;quot; height=&amp;quot;315&amp;quot; src=&amp;quot;https://www.youtube.com/embed/syp6Lsd8HOo&amp;quot; title=&amp;quot;YouTube video player&amp;quot; frameborder=&amp;quot;0&amp;quot; allow=&amp;quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&amp;quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
source code:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
&amp;lt;iframe width=&amp;quot;560&amp;quot; height=&amp;quot;315&amp;quot; src=&amp;quot;https://www.youtube.com/embed/syp6Lsd8HOo&amp;quot; title=&amp;quot;YouTube video player&amp;quot; frameborder=&amp;quot;0&amp;quot; allow=&amp;quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&amp;quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== expandable ==&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed mono expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
* [https://www.youtube.com/ youtube]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
source:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed mono expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
* [https://www.youtube.com/ youtube]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test ==&lt;br /&gt;
&lt;br /&gt;
{{#mermaid:&lt;br /&gt;
graph TD&lt;br /&gt;
    A[Start] --&amp;gt; B{Is Mermaid enabled?}&lt;br /&gt;
    B --&amp;gt;|Yes| C[Render diagram]&lt;br /&gt;
    B --&amp;gt;|No| D[Show code as text]&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Stonezhong</name></author>
	</entry>
	<entry>
		<id>https://home.stonezhong.net/index.php?title=About-wiki&amp;diff=426</id>
		<title>About-wiki</title>
		<link rel="alternate" type="text/html" href="https://home.stonezhong.net/index.php?title=About-wiki&amp;diff=426"/>
		<updated>2025-11-19T05:23:42Z</updated>

		<summary type="html">&lt;p&gt;Stonezhong: /* test */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Wiki Features =&lt;br /&gt;
== Global CSS ==&lt;br /&gt;
* [[MediaWiki:Common.css|Global CSS]]&lt;br /&gt;
&lt;br /&gt;
== You can use raw HTML tags ==&lt;br /&gt;
You can wrap your html content in &amp;lt;nowiki&amp;gt;&amp;lt;html&amp;gt;...&amp;lt;/html&amp;gt;&amp;lt;/nowiki&amp;gt;, for example, &lt;br /&gt;
&amp;lt;html&amp;gt;&amp;lt;div style=&amp;quot;background-color:green;&amp;quot;&amp;gt;hello&amp;lt;/div&amp;gt;&amp;lt;/html&amp;gt;&lt;br /&gt;
source code:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;html&amp;gt;&amp;lt;div style=&amp;quot;background-color:green;&amp;quot;&amp;gt;hello&amp;lt;/div&amp;gt;&amp;lt;/html&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== You can insert external images ==&lt;br /&gt;
=== method 1: use raw img tag ===&lt;br /&gt;
for example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html&amp;gt;&amp;lt;img src=&amp;quot;https://upload.wikimedia.org/wikipedia/commons/thumb/e/e1/FullMoon2010.jpg/220px-FullMoon2010.jpg&amp;quot; /&amp;gt;&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
source code:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&amp;lt;img src=&amp;quot;https://upload.wikimedia.org/wikipedia/commons/thumb/e/e1/FullMoon2010.jpg/220px-FullMoon2010.jpg&amp;quot; /&amp;gt;&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== method 2: use traditional wiki style ===&lt;br /&gt;
Example:&lt;br /&gt;
{|&lt;br /&gt;
| https://upload.wikimedia.org/wikipedia/commons/thumb/e/e1/FullMoon2010.jpg/220px-FullMoon2010.jpg&lt;br /&gt;
|-&lt;br /&gt;
| This is a picture&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
source code:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
{|&lt;br /&gt;
| https://upload.wikimedia.org/wikipedia/commons/thumb/e/e1/FullMoon2010.jpg/220px-FullMoon2010.jpg&lt;br /&gt;
|-&lt;br /&gt;
| This is a picture&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== insert youtube video ==&lt;br /&gt;
Insert raw html directly. example&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;iframe width=&amp;quot;560&amp;quot; height=&amp;quot;315&amp;quot; src=&amp;quot;https://www.youtube.com/embed/syp6Lsd8HOo&amp;quot; title=&amp;quot;YouTube video player&amp;quot; frameborder=&amp;quot;0&amp;quot; allow=&amp;quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&amp;quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
source code:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
&amp;lt;iframe width=&amp;quot;560&amp;quot; height=&amp;quot;315&amp;quot; src=&amp;quot;https://www.youtube.com/embed/syp6Lsd8HOo&amp;quot; title=&amp;quot;YouTube video player&amp;quot; frameborder=&amp;quot;0&amp;quot; allow=&amp;quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&amp;quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== expandable ==&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed mono expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
* [https://www.youtube.com/ youtube]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
source:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed mono expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
* [https://www.youtube.com/ youtube]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;mermaid&amp;gt;&lt;br /&gt;
graph TD; A--&amp;gt;B;&lt;br /&gt;
&amp;lt;/mermaid&amp;gt;&lt;/div&gt;</summary>
		<author><name>Stonezhong</name></author>
	</entry>
	<entry>
		<id>https://home.stonezhong.net/index.php?title=About-wiki&amp;diff=425</id>
		<title>About-wiki</title>
		<link rel="alternate" type="text/html" href="https://home.stonezhong.net/index.php?title=About-wiki&amp;diff=425"/>
		<updated>2025-11-19T05:21:24Z</updated>

		<summary type="html">&lt;p&gt;Stonezhong: /* test */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Wiki Features =&lt;br /&gt;
== Global CSS ==&lt;br /&gt;
* [[MediaWiki:Common.css|Global CSS]]&lt;br /&gt;
&lt;br /&gt;
== You can use raw HTML tags ==&lt;br /&gt;
You can wrap your html content in &amp;lt;nowiki&amp;gt;&amp;lt;html&amp;gt;...&amp;lt;/html&amp;gt;&amp;lt;/nowiki&amp;gt;, for example, &lt;br /&gt;
&amp;lt;html&amp;gt;&amp;lt;div style=&amp;quot;background-color:green;&amp;quot;&amp;gt;hello&amp;lt;/div&amp;gt;&amp;lt;/html&amp;gt;&lt;br /&gt;
source code:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;html&amp;gt;&amp;lt;div style=&amp;quot;background-color:green;&amp;quot;&amp;gt;hello&amp;lt;/div&amp;gt;&amp;lt;/html&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== You can insert external images ==&lt;br /&gt;
=== method 1: use raw img tag ===&lt;br /&gt;
for example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html&amp;gt;&amp;lt;img src=&amp;quot;https://upload.wikimedia.org/wikipedia/commons/thumb/e/e1/FullMoon2010.jpg/220px-FullMoon2010.jpg&amp;quot; /&amp;gt;&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
source code:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&amp;lt;img src=&amp;quot;https://upload.wikimedia.org/wikipedia/commons/thumb/e/e1/FullMoon2010.jpg/220px-FullMoon2010.jpg&amp;quot; /&amp;gt;&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== method 2: use traditional wiki style ===&lt;br /&gt;
Example:&lt;br /&gt;
{|&lt;br /&gt;
| https://upload.wikimedia.org/wikipedia/commons/thumb/e/e1/FullMoon2010.jpg/220px-FullMoon2010.jpg&lt;br /&gt;
|-&lt;br /&gt;
| This is a picture&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
source code:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
{|&lt;br /&gt;
| https://upload.wikimedia.org/wikipedia/commons/thumb/e/e1/FullMoon2010.jpg/220px-FullMoon2010.jpg&lt;br /&gt;
|-&lt;br /&gt;
| This is a picture&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== insert youtube video ==&lt;br /&gt;
Insert raw html directly. example&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;iframe width=&amp;quot;560&amp;quot; height=&amp;quot;315&amp;quot; src=&amp;quot;https://www.youtube.com/embed/syp6Lsd8HOo&amp;quot; title=&amp;quot;YouTube video player&amp;quot; frameborder=&amp;quot;0&amp;quot; allow=&amp;quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&amp;quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
source code:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
&amp;lt;iframe width=&amp;quot;560&amp;quot; height=&amp;quot;315&amp;quot; src=&amp;quot;https://www.youtube.com/embed/syp6Lsd8HOo&amp;quot; title=&amp;quot;YouTube video player&amp;quot; frameborder=&amp;quot;0&amp;quot; allow=&amp;quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&amp;quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== expandable ==&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed mono expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
* [https://www.youtube.com/ youtube]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
source:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed mono expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
* [https://www.youtube.com/ youtube]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;mermaid&amp;gt;&lt;br /&gt;
graph TD&lt;br /&gt;
    A[Start] --&amp;gt; B{Is Mermaid enabled?}&lt;br /&gt;
    B --&amp;gt;|Yes| C[Render diagram]&lt;br /&gt;
    B --&amp;gt;|No| D[Show code as text]&lt;br /&gt;
&amp;lt;/mermaid&amp;gt;&lt;/div&gt;</summary>
		<author><name>Stonezhong</name></author>
	</entry>
	<entry>
		<id>https://home.stonezhong.net/index.php?title=About-wiki&amp;diff=424</id>
		<title>About-wiki</title>
		<link rel="alternate" type="text/html" href="https://home.stonezhong.net/index.php?title=About-wiki&amp;diff=424"/>
		<updated>2025-11-19T04:54:21Z</updated>

		<summary type="html">&lt;p&gt;Stonezhong: /* expandable */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Wiki Features =&lt;br /&gt;
== Global CSS ==&lt;br /&gt;
* [[MediaWiki:Common.css|Global CSS]]&lt;br /&gt;
&lt;br /&gt;
== You can use raw HTML tags ==&lt;br /&gt;
You can wrap your html content in &amp;lt;nowiki&amp;gt;&amp;lt;html&amp;gt;...&amp;lt;/html&amp;gt;&amp;lt;/nowiki&amp;gt;, for example, &lt;br /&gt;
&amp;lt;html&amp;gt;&amp;lt;div style=&amp;quot;background-color:green;&amp;quot;&amp;gt;hello&amp;lt;/div&amp;gt;&amp;lt;/html&amp;gt;&lt;br /&gt;
source code:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;html&amp;gt;&amp;lt;div style=&amp;quot;background-color:green;&amp;quot;&amp;gt;hello&amp;lt;/div&amp;gt;&amp;lt;/html&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== You can insert external images ==&lt;br /&gt;
=== method 1: use raw img tag ===&lt;br /&gt;
for example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html&amp;gt;&amp;lt;img src=&amp;quot;https://upload.wikimedia.org/wikipedia/commons/thumb/e/e1/FullMoon2010.jpg/220px-FullMoon2010.jpg&amp;quot; /&amp;gt;&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
source code:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&amp;lt;img src=&amp;quot;https://upload.wikimedia.org/wikipedia/commons/thumb/e/e1/FullMoon2010.jpg/220px-FullMoon2010.jpg&amp;quot; /&amp;gt;&amp;lt;/html&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== method 2: use traditional wiki style ===&lt;br /&gt;
Example:&lt;br /&gt;
{|&lt;br /&gt;
| https://upload.wikimedia.org/wikipedia/commons/thumb/e/e1/FullMoon2010.jpg/220px-FullMoon2010.jpg&lt;br /&gt;
|-&lt;br /&gt;
| This is a picture&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
source code:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
{|&lt;br /&gt;
| https://upload.wikimedia.org/wikipedia/commons/thumb/e/e1/FullMoon2010.jpg/220px-FullMoon2010.jpg&lt;br /&gt;
|-&lt;br /&gt;
| This is a picture&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== insert youtube video ==&lt;br /&gt;
Insert raw html directly. example&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;iframe width=&amp;quot;560&amp;quot; height=&amp;quot;315&amp;quot; src=&amp;quot;https://www.youtube.com/embed/syp6Lsd8HOo&amp;quot; title=&amp;quot;YouTube video player&amp;quot; frameborder=&amp;quot;0&amp;quot; allow=&amp;quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&amp;quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;br /&gt;
&lt;br /&gt;
source code:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
&amp;lt;iframe width=&amp;quot;560&amp;quot; height=&amp;quot;315&amp;quot; src=&amp;quot;https://www.youtube.com/embed/syp6Lsd8HOo&amp;quot; title=&amp;quot;YouTube video player&amp;quot; frameborder=&amp;quot;0&amp;quot; allow=&amp;quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&amp;quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== expandable ==&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed mono expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
* [https://www.youtube.com/ youtube]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
source:&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed mono expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
* [https://www.youtube.com/ youtube]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test ==&lt;br /&gt;
&amp;lt;mermaid&amp;gt;&lt;br /&gt;
graph TD&lt;br /&gt;
    A[Start] --&amp;gt; B{Is Mermaid enabled?}&lt;br /&gt;
    B --&amp;gt;|Yes| C[Render diagram]&lt;br /&gt;
    B --&amp;gt;|No| D[Show code as text]&lt;br /&gt;
&amp;lt;/mermaid&amp;gt;&lt;/div&gt;</summary>
		<author><name>Stonezhong</name></author>
	</entry>
	<entry>
		<id>https://home.stonezhong.net/index.php?title=Dl/Best_Practices&amp;diff=423</id>
		<title>Dl/Best Practices</title>
		<link rel="alternate" type="text/html" href="https://home.stonezhong.net/index.php?title=Dl/Best_Practices&amp;diff=423"/>
		<updated>2024-09-09T09:36:45Z</updated>

		<summary type="html">&lt;p&gt;Stonezhong: /* Platform */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;p&amp;gt; [[dl/home|Data Lake Knowledge Center]] &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Platform =&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;Apache Spark&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
Apache Spark is a good platform for batch based data processing as well as streaming based data processing. Advantage:&lt;br /&gt;
* Scalable&lt;br /&gt;
* Well supported (DataBricks is backing up this product)&lt;br /&gt;
* Well adopted&lt;br /&gt;
* Supported by many cloud providers ([https://aws.amazon.com/emr/ AWS EMR], [https://azure.microsoft.com/en-us/products/hdinsight Azure HDInsight] , [https://cloud.google.com/dataproc GCP Dataproc]， [https://www.oracle.com/big-data/data-flow/ OCI dataflow])&lt;br /&gt;
* Instead of building your own data lake, you can use [https://www.databricks.com/ LakeHouse] provided by databricks, they support AWS, Azure and GCP.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Data Ingestion =&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;Always save a copy of raw data&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
When you do data ingestion, you want to save the raw data for the following reasons&lt;br /&gt;
* Your ingestion pipeline may have bugs, saving raw data allows you to fix bugs and re-populate the data&lt;br /&gt;
* Raw data may not meed the data quality and you may ignore it, in case you ignore it, keep the raw data allows you to check what kind of data quality problem they are, and sometimes you can inform the data producer to have it fixed.&lt;br /&gt;
* Raw data is owned by data source team and they have their own retention policy -- raw data is not always accessible afterwards.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;Use data connectors to manage data ingestions&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
* Create highly reusable &amp;quot;data connectors&amp;quot; to manage the data ingestio&lt;br /&gt;
** An anti pattern is to create too many one time, custome written, poorly documented data ingestion code&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Data Governance =&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;Keep good structure of your data&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
* raw, sometime unstructured data:&lt;br /&gt;
- you stage the raw data (to be ingested) here, sometimes, these data can be unstructured.&lt;br /&gt;
&lt;br /&gt;
* raw, ingested data&lt;br /&gt;
- they are structured, e.g. in parquet format. They captured all the information you interested from raw data. They may orgnized well -- the purpose is to capture all raw information with minimum processing.&lt;br /&gt;
&lt;br /&gt;
* logical data layer&lt;br /&gt;
- well modeled, maybe around a subject model. (a fact table with bunch of dimension tables)&lt;br /&gt;
&lt;br /&gt;
See also &lt;br /&gt;
* [https://lingarogroup.com/blog/data-lake-architecture Data Lake Architecture: How to Create a Well Designed Data Lake]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Stonezhong</name></author>
	</entry>
	<entry>
		<id>https://home.stonezhong.net/index.php?title=Dl/Best_Practices&amp;diff=422</id>
		<title>Dl/Best Practices</title>
		<link rel="alternate" type="text/html" href="https://home.stonezhong.net/index.php?title=Dl/Best_Practices&amp;diff=422"/>
		<updated>2024-09-09T09:36:25Z</updated>

		<summary type="html">&lt;p&gt;Stonezhong: /* Platform */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;p&amp;gt; [[dl/home|Data Lake Knowledge Center]] &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Platform =&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;Apache Spark&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
Apache Spark is a good platform for batch based data processing as well as streaming based data processing. Advantage:&lt;br /&gt;
* Scalable&lt;br /&gt;
* Well supported (DataBricks is backing up this product)&lt;br /&gt;
* Well adopted&lt;br /&gt;
* Supported by many cloud providers ([https://aws.amazon.com/emr/ AWS EMR], [https://azure.microsoft.com/en-us/products/hdinsight Azure HDInsight] , [https://cloud.google.com/dataproc GCP Dataproc]， [https://www.oracle.com/big-data/data-flow/ OCI dataflow])&lt;br /&gt;
* In stead of building your own data lake, you can use [https://www.databricks.com/ LakeHouse] provided by databricks, they support AWS, Azure and GCP.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Data Ingestion =&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;Always save a copy of raw data&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
When you do data ingestion, you want to save the raw data for the following reasons&lt;br /&gt;
* Your ingestion pipeline may have bugs, saving raw data allows you to fix bugs and re-populate the data&lt;br /&gt;
* Raw data may not meed the data quality and you may ignore it, in case you ignore it, keep the raw data allows you to check what kind of data quality problem they are, and sometimes you can inform the data producer to have it fixed.&lt;br /&gt;
* Raw data is owned by data source team and they have their own retention policy -- raw data is not always accessible afterwards.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;Use data connectors to manage data ingestions&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
* Create highly reusable &amp;quot;data connectors&amp;quot; to manage the data ingestio&lt;br /&gt;
** An anti pattern is to create too many one time, custome written, poorly documented data ingestion code&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Data Governance =&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;Keep good structure of your data&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
* raw, sometime unstructured data:&lt;br /&gt;
- you stage the raw data (to be ingested) here, sometimes, these data can be unstructured.&lt;br /&gt;
&lt;br /&gt;
* raw, ingested data&lt;br /&gt;
- they are structured, e.g. in parquet format. They captured all the information you interested from raw data. They may orgnized well -- the purpose is to capture all raw information with minimum processing.&lt;br /&gt;
&lt;br /&gt;
* logical data layer&lt;br /&gt;
- well modeled, maybe around a subject model. (a fact table with bunch of dimension tables)&lt;br /&gt;
&lt;br /&gt;
See also &lt;br /&gt;
* [https://lingarogroup.com/blog/data-lake-architecture Data Lake Architecture: How to Create a Well Designed Data Lake]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Stonezhong</name></author>
	</entry>
	<entry>
		<id>https://home.stonezhong.net/index.php?title=Dl/Best_Practices&amp;diff=421</id>
		<title>Dl/Best Practices</title>
		<link rel="alternate" type="text/html" href="https://home.stonezhong.net/index.php?title=Dl/Best_Practices&amp;diff=421"/>
		<updated>2024-09-09T09:35:30Z</updated>

		<summary type="html">&lt;p&gt;Stonezhong: /* Platform */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;p&amp;gt; [[dl/home|Data Lake Knowledge Center]] &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Platform =&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;Apache Spark&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
Apache Spark is a good platform for batch based data processing as well as streaming based data processing. Advantage:&lt;br /&gt;
* Scalable&lt;br /&gt;
* Well supported (DataBricks is backing up this product)&lt;br /&gt;
* Well adopted&lt;br /&gt;
* Supported by many cloud providers ([https://aws.amazon.com/emr/ AWS EMR], [https://azure.microsoft.com/en-us/products/hdinsight Azure HDInsight] , [https://cloud.google.com/dataproc GCP Dataproc]， oci dataflow)&lt;br /&gt;
* In stead of building your own data lake, you can use [https://www.databricks.com/ LakeHouse] provided by databricks, they support AWS, Azure and GCP.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Data Ingestion =&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;Always save a copy of raw data&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
When you do data ingestion, you want to save the raw data for the following reasons&lt;br /&gt;
* Your ingestion pipeline may have bugs, saving raw data allows you to fix bugs and re-populate the data&lt;br /&gt;
* Raw data may not meed the data quality and you may ignore it, in case you ignore it, keep the raw data allows you to check what kind of data quality problem they are, and sometimes you can inform the data producer to have it fixed.&lt;br /&gt;
* Raw data is owned by data source team and they have their own retention policy -- raw data is not always accessible afterwards.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;Use data connectors to manage data ingestions&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
* Create highly reusable &amp;quot;data connectors&amp;quot; to manage the data ingestio&lt;br /&gt;
** An anti pattern is to create too many one time, custome written, poorly documented data ingestion code&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Data Governance =&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;Keep good structure of your data&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
* raw, sometime unstructured data:&lt;br /&gt;
- you stage the raw data (to be ingested) here, sometimes, these data can be unstructured.&lt;br /&gt;
&lt;br /&gt;
* raw, ingested data&lt;br /&gt;
- they are structured, e.g. in parquet format. They captured all the information you interested from raw data. They may orgnized well -- the purpose is to capture all raw information with minimum processing.&lt;br /&gt;
&lt;br /&gt;
* logical data layer&lt;br /&gt;
- well modeled, maybe around a subject model. (a fact table with bunch of dimension tables)&lt;br /&gt;
&lt;br /&gt;
See also &lt;br /&gt;
* [https://lingarogroup.com/blog/data-lake-architecture Data Lake Architecture: How to Create a Well Designed Data Lake]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Stonezhong</name></author>
	</entry>
	<entry>
		<id>https://home.stonezhong.net/index.php?title=Dl/Best_Practices&amp;diff=420</id>
		<title>Dl/Best Practices</title>
		<link rel="alternate" type="text/html" href="https://home.stonezhong.net/index.php?title=Dl/Best_Practices&amp;diff=420"/>
		<updated>2024-09-09T09:35:14Z</updated>

		<summary type="html">&lt;p&gt;Stonezhong: /* Platform */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;p&amp;gt; [[dl/home|Data Lake Knowledge Center]] &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Platform =&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;Spark&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
Apache Spark is a good platform for batch based data processing as well as streaming based data processing. Advantage:&lt;br /&gt;
* Scalable&lt;br /&gt;
* Well supported (DataBricks is backing up this product)&lt;br /&gt;
* Well adopted&lt;br /&gt;
* Supported by many cloud providers ([https://aws.amazon.com/emr/ AWS EMR], [https://azure.microsoft.com/en-us/products/hdinsight Azure HDInsight] , [https://cloud.google.com/dataproc GCP Dataproc]， oci dataflow)&lt;br /&gt;
* In stead of building your own data lake, you can use [https://www.databricks.com/ LakeHouse] provided by databricks, they support AWS, Azure and GCP.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Data Ingestion =&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;Always save a copy of raw data&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
When you do data ingestion, you want to save the raw data for the following reasons&lt;br /&gt;
* Your ingestion pipeline may have bugs, saving raw data allows you to fix bugs and re-populate the data&lt;br /&gt;
* Raw data may not meed the data quality and you may ignore it, in case you ignore it, keep the raw data allows you to check what kind of data quality problem they are, and sometimes you can inform the data producer to have it fixed.&lt;br /&gt;
* Raw data is owned by data source team and they have their own retention policy -- raw data is not always accessible afterwards.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;Use data connectors to manage data ingestions&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
* Create highly reusable &amp;quot;data connectors&amp;quot; to manage the data ingestio&lt;br /&gt;
** An anti pattern is to create too many one time, custome written, poorly documented data ingestion code&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Data Governance =&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;Keep good structure of your data&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
* raw, sometime unstructured data:&lt;br /&gt;
- you stage the raw data (to be ingested) here, sometimes, these data can be unstructured.&lt;br /&gt;
&lt;br /&gt;
* raw, ingested data&lt;br /&gt;
- they are structured, e.g. in parquet format. They captured all the information you interested from raw data. They may orgnized well -- the purpose is to capture all raw information with minimum processing.&lt;br /&gt;
&lt;br /&gt;
* logical data layer&lt;br /&gt;
- well modeled, maybe around a subject model. (a fact table with bunch of dimension tables)&lt;br /&gt;
&lt;br /&gt;
See also &lt;br /&gt;
* [https://lingarogroup.com/blog/data-lake-architecture Data Lake Architecture: How to Create a Well Designed Data Lake]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Stonezhong</name></author>
	</entry>
	<entry>
		<id>https://home.stonezhong.net/index.php?title=Dl/Best_Practices&amp;diff=419</id>
		<title>Dl/Best Practices</title>
		<link rel="alternate" type="text/html" href="https://home.stonezhong.net/index.php?title=Dl/Best_Practices&amp;diff=419"/>
		<updated>2024-09-09T09:33:25Z</updated>

		<summary type="html">&lt;p&gt;Stonezhong: /* Data Ingestion */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;p&amp;gt; [[dl/home|Data Lake Knowledge Center]] &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Platform =&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;Spark&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
Apache Spark is a good platform for batch based data processing as well as streaming based data processing. Advantage:&lt;br /&gt;
* Scalable&lt;br /&gt;
* Well supported (DataBricks is backing up this product)&lt;br /&gt;
* Well adopted&lt;br /&gt;
* Supported by many cloud providers (AWS EMR, Azure Azure HDInsight, [https://cloud.google.com/dataproc GCP Dataproc]， oci dataflow)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Data Ingestion =&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;Always save a copy of raw data&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
When you do data ingestion, you want to save the raw data for the following reasons&lt;br /&gt;
* Your ingestion pipeline may have bugs, saving raw data allows you to fix bugs and re-populate the data&lt;br /&gt;
* Raw data may not meed the data quality and you may ignore it, in case you ignore it, keep the raw data allows you to check what kind of data quality problem they are, and sometimes you can inform the data producer to have it fixed.&lt;br /&gt;
* Raw data is owned by data source team and they have their own retention policy -- raw data is not always accessible afterwards.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;Use data connectors to manage data ingestions&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
* Create highly reusable &amp;quot;data connectors&amp;quot; to manage the data ingestio&lt;br /&gt;
** An anti pattern is to create too many one time, custome written, poorly documented data ingestion code&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Data Governance =&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;Keep good structure of your data&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
* raw, sometime unstructured data:&lt;br /&gt;
- you stage the raw data (to be ingested) here, sometimes, these data can be unstructured.&lt;br /&gt;
&lt;br /&gt;
* raw, ingested data&lt;br /&gt;
- they are structured, e.g. in parquet format. They captured all the information you interested from raw data. They may orgnized well -- the purpose is to capture all raw information with minimum processing.&lt;br /&gt;
&lt;br /&gt;
* logical data layer&lt;br /&gt;
- well modeled, maybe around a subject model. (a fact table with bunch of dimension tables)&lt;br /&gt;
&lt;br /&gt;
See also &lt;br /&gt;
* [https://lingarogroup.com/blog/data-lake-architecture Data Lake Architecture: How to Create a Well Designed Data Lake]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Stonezhong</name></author>
	</entry>
	<entry>
		<id>https://home.stonezhong.net/index.php?title=Dl/Best_Practices&amp;diff=418</id>
		<title>Dl/Best Practices</title>
		<link rel="alternate" type="text/html" href="https://home.stonezhong.net/index.php?title=Dl/Best_Practices&amp;diff=418"/>
		<updated>2024-09-09T09:24:41Z</updated>

		<summary type="html">&lt;p&gt;Stonezhong: /* Data Ingestion */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;p&amp;gt; [[dl/home|Data Lake Knowledge Center]] &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Data Ingestion =&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;Always save a copy of raw data&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
When you do data ingestion, you want to save the raw data for the following reasons&lt;br /&gt;
* Your ingestion pipeline may have bugs, saving raw data allows you to fix bugs and re-populate the data&lt;br /&gt;
* Raw data may not meed the data quality and you may ignore it, in case you ignore it, keep the raw data allows you to check what kind of data quality problem they are, and sometimes you can inform the data producer to have it fixed.&lt;br /&gt;
* Raw data is owned by data source team and they have their own retention policy -- raw data is not always accessible afterwards.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;Use data connectors to manage data ingestions&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
* Create highly reusable &amp;quot;data connectors&amp;quot; to manage the data ingestio&lt;br /&gt;
** An anti pattern is to create too many one time, custome written, poorly documented data ingestion code&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Data Governance =&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;Keep good structure of your data&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
* raw, sometime unstructured data:&lt;br /&gt;
- you stage the raw data (to be ingested) here, sometimes, these data can be unstructured.&lt;br /&gt;
&lt;br /&gt;
* raw, ingested data&lt;br /&gt;
- they are structured, e.g. in parquet format. They captured all the information you interested from raw data. They may orgnized well -- the purpose is to capture all raw information with minimum processing.&lt;br /&gt;
&lt;br /&gt;
* logical data layer&lt;br /&gt;
- well modeled, maybe around a subject model. (a fact table with bunch of dimension tables)&lt;br /&gt;
&lt;br /&gt;
See also &lt;br /&gt;
* [https://lingarogroup.com/blog/data-lake-architecture Data Lake Architecture: How to Create a Well Designed Data Lake]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Stonezhong</name></author>
	</entry>
	<entry>
		<id>https://home.stonezhong.net/index.php?title=Dl/Best_Practices&amp;diff=417</id>
		<title>Dl/Best Practices</title>
		<link rel="alternate" type="text/html" href="https://home.stonezhong.net/index.php?title=Dl/Best_Practices&amp;diff=417"/>
		<updated>2024-09-09T09:20:37Z</updated>

		<summary type="html">&lt;p&gt;Stonezhong: /* Data Governance */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;p&amp;gt; [[dl/home|Data Lake Knowledge Center]] &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Data Ingestion =&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;Always save a copy of raw data&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
When you do data ingestion, you want to save the raw data for the following reasons&lt;br /&gt;
* Your ingestion pipeline may have bugs, saving raw data allows you to fix bugs and re-populate the data&lt;br /&gt;
* Raw data may not meed the data quality and you may ignore it, in case you ignore it, keep the raw data allows you to check what kind of data quality problem they are, and sometimes you can inform the data producer to have it fixed.&lt;br /&gt;
* Raw data is owned by data source team and they have their own retention policy -- raw data is not always accessible afterwards.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Data Governance =&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;Keep good structure of your data&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
* raw, sometime unstructured data:&lt;br /&gt;
- you stage the raw data (to be ingested) here, sometimes, these data can be unstructured.&lt;br /&gt;
&lt;br /&gt;
* raw, ingested data&lt;br /&gt;
- they are structured, e.g. in parquet format. They captured all the information you interested from raw data. They may orgnized well -- the purpose is to capture all raw information with minimum processing.&lt;br /&gt;
&lt;br /&gt;
* logical data layer&lt;br /&gt;
- well modeled, maybe around a subject model. (a fact table with bunch of dimension tables)&lt;br /&gt;
&lt;br /&gt;
See also &lt;br /&gt;
* [https://lingarogroup.com/blog/data-lake-architecture Data Lake Architecture: How to Create a Well Designed Data Lake]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Stonezhong</name></author>
	</entry>
	<entry>
		<id>https://home.stonezhong.net/index.php?title=Dl/Best_Practices&amp;diff=416</id>
		<title>Dl/Best Practices</title>
		<link rel="alternate" type="text/html" href="https://home.stonezhong.net/index.php?title=Dl/Best_Practices&amp;diff=416"/>
		<updated>2024-09-09T09:20:11Z</updated>

		<summary type="html">&lt;p&gt;Stonezhong: /* Data Governance */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;p&amp;gt; [[dl/home|Data Lake Knowledge Center]] &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Data Ingestion =&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;Always save a copy of raw data&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
When you do data ingestion, you want to save the raw data for the following reasons&lt;br /&gt;
* Your ingestion pipeline may have bugs, saving raw data allows you to fix bugs and re-populate the data&lt;br /&gt;
* Raw data may not meed the data quality and you may ignore it, in case you ignore it, keep the raw data allows you to check what kind of data quality problem they are, and sometimes you can inform the data producer to have it fixed.&lt;br /&gt;
* Raw data is owned by data source team and they have their own retention policy -- raw data is not always accessible afterwards.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Data Governance =&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;Keep good structure of your data&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
raw, sometime unstructured data:&lt;br /&gt;
- you stage the raw data (to be ingested) here, sometimes, these data can be unstructured.&lt;br /&gt;
&lt;br /&gt;
raw, ingested data&lt;br /&gt;
- they are structured, e.g. in parquet format. They captured all the information you interested from raw data. They may orgnized well -- the purpose is to capture all raw information with minimum processing.&lt;br /&gt;
&lt;br /&gt;
logical data layer&lt;br /&gt;
- well modeled, maybe around a subject model. (a fact table with bunch of dimension tables)&lt;br /&gt;
&lt;br /&gt;
See also [https://lingarogroup.com/blog/data-lake-architecture Data Lake Architecture: How to Create a Well Designed Data Lake]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Stonezhong</name></author>
	</entry>
	<entry>
		<id>https://home.stonezhong.net/index.php?title=Dl/Best_Practices&amp;diff=415</id>
		<title>Dl/Best Practices</title>
		<link rel="alternate" type="text/html" href="https://home.stonezhong.net/index.php?title=Dl/Best_Practices&amp;diff=415"/>
		<updated>2024-09-09T09:02:31Z</updated>

		<summary type="html">&lt;p&gt;Stonezhong: /* Data Ingestion */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;p&amp;gt; [[dl/home|Data Lake Knowledge Center]] &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Data Ingestion =&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;Always save a copy of raw data&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
When you do data ingestion, you want to save the raw data for the following reasons&lt;br /&gt;
* Your ingestion pipeline may have bugs, saving raw data allows you to fix bugs and re-populate the data&lt;br /&gt;
* Raw data may not meed the data quality and you may ignore it, in case you ignore it, keep the raw data allows you to check what kind of data quality problem they are, and sometimes you can inform the data producer to have it fixed.&lt;br /&gt;
* Raw data is owned by data source team and they have their own retention policy -- raw data is not always accessible afterwards.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Data Governance =&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;Keep good structure of your data&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Stonezhong</name></author>
	</entry>
	<entry>
		<id>https://home.stonezhong.net/index.php?title=Dl/Best_Practices&amp;diff=414</id>
		<title>Dl/Best Practices</title>
		<link rel="alternate" type="text/html" href="https://home.stonezhong.net/index.php?title=Dl/Best_Practices&amp;diff=414"/>
		<updated>2024-09-09T09:00:50Z</updated>

		<summary type="html">&lt;p&gt;Stonezhong: /* Data Ingestion */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;p&amp;gt; [[dl/home|Data Lake Knowledge Center]] &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Data Ingestion =&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;Always save a copy of raw data&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
When you do data ingestion, you want to save the raw data for the following reasons&lt;br /&gt;
* Your ingestion pipeline may have bugs, saving raw data allows you to fix bugs and re-populate the data&lt;br /&gt;
* Raw data may not meed the data quality and you may ignore it, in case you ignore it, keep the raw data allows you to check what kind of data quality problem they are, and sometimes you can inform the data producer to have it fixed.&lt;br /&gt;
* Raw data is owned by data source team and they have their own retention policy -- raw data is not always accessible afterwards.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Stonezhong</name></author>
	</entry>
	<entry>
		<id>https://home.stonezhong.net/index.php?title=Dl/Best_Practices&amp;diff=413</id>
		<title>Dl/Best Practices</title>
		<link rel="alternate" type="text/html" href="https://home.stonezhong.net/index.php?title=Dl/Best_Practices&amp;diff=413"/>
		<updated>2024-09-09T08:59:48Z</updated>

		<summary type="html">&lt;p&gt;Stonezhong: /* Data Ingestion */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;p&amp;gt; [[dl/home|Data Lake Knowledge Center]] &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Data Ingestion =&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;Always save a copy of raw data&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
When you do data ingestion, you want to save the raw data for the following reasons&lt;br /&gt;
* Your ingestion pipeline may have bugs, saving raw data allows you to fix bugs and re-populate the data&lt;br /&gt;
* Raw data may not meed the data quality and you may ignore it, in case you ignore it, keep the raw data allows you to check what kind of data quality problem they are, and sometimes you can inform the data producer to have it fixed.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Stonezhong</name></author>
	</entry>
	<entry>
		<id>https://home.stonezhong.net/index.php?title=Dl/Best_Practices&amp;diff=412</id>
		<title>Dl/Best Practices</title>
		<link rel="alternate" type="text/html" href="https://home.stonezhong.net/index.php?title=Dl/Best_Practices&amp;diff=412"/>
		<updated>2024-09-09T08:56:12Z</updated>

		<summary type="html">&lt;p&gt;Stonezhong: /* Best Practices */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;p&amp;gt; [[dl/home|Data Lake Knowledge Center]] &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Data Ingestion =&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;Brief&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Stonezhong</name></author>
	</entry>
	<entry>
		<id>https://home.stonezhong.net/index.php?title=Dl/Best_Practices&amp;diff=411</id>
		<title>Dl/Best Practices</title>
		<link rel="alternate" type="text/html" href="https://home.stonezhong.net/index.php?title=Dl/Best_Practices&amp;diff=411"/>
		<updated>2024-09-09T08:55:07Z</updated>

		<summary type="html">&lt;p&gt;Stonezhong: /* Best Practices */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;p&amp;gt; [[dl/home|Data Lake Knowledge Center]] &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Best Practices =&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;Definition&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Stonezhong</name></author>
	</entry>
	<entry>
		<id>https://home.stonezhong.net/index.php?title=Dl/Best_Practices&amp;diff=410</id>
		<title>Dl/Best Practices</title>
		<link rel="alternate" type="text/html" href="https://home.stonezhong.net/index.php?title=Dl/Best_Practices&amp;diff=410"/>
		<updated>2024-09-09T08:54:28Z</updated>

		<summary type="html">&lt;p&gt;Stonezhong: Created page with &amp;quot;= Best Practices = &amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt; &amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;Definition&amp;lt;/div&amp;gt; &amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;/div&amp;gt; &amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Best Practices =&lt;br /&gt;
&amp;lt;div class=&amp;quot;toccolours mw-collapsible mw-collapsed expandable&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-preview&amp;quot;&amp;gt;Definition&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Stonezhong</name></author>
	</entry>
	<entry>
		<id>https://home.stonezhong.net/index.php?title=Dl/home&amp;diff=409</id>
		<title>Dl/home</title>
		<link rel="alternate" type="text/html" href="https://home.stonezhong.net/index.php?title=Dl/home&amp;diff=409"/>
		<updated>2024-09-09T08:53:42Z</updated>

		<summary type="html">&lt;p&gt;Stonezhong: /* Product Release Checklist */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= [[dl/Models|Models]] =&lt;br /&gt;
= [[dl/DatasetRepository|Dataset Repository]] =&lt;br /&gt;
= [[dl/DataApplication|Data Application]] =&lt;br /&gt;
= [[dl/devops|devops]] =&lt;br /&gt;
= [[dl/sprint|sprint]] =&lt;br /&gt;
= [[dl/glossary|Glossary]] =&lt;br /&gt;
= [[dl/Notes|Notes]] =&lt;br /&gt;
= [[dl/Product Release Checklist|Product Release Checklist]] =&lt;br /&gt;
= [[dl/Best Practices|Best Practices]] =&lt;/div&gt;</summary>
		<author><name>Stonezhong</name></author>
	</entry>
</feed>