From 712749050ec4ed00151683b226a2e49fb58093b3 Mon Sep 17 00:00:00 2001 From: ulysses-you Date: Wed, 1 Dec 2021 18:50:29 +0800 Subject: [PATCH] [KYUUBI #1481] Add z-order docs ### _Why are the changes needed?_ introduce how to use z-order with Kyuubi ### _How was this patch tested?_ iShot2021-12-01 16 08 24 Closes #1481 from ulysses-you/zorder-docs. Closes #1481 98b3e5f4 [ulysses-you] comment 7adeacd6 [ulysses-you] comment 62483a88 [ulysses-you] docs Authored-by: ulysses-you Signed-off-by: Kent Yao --- docs/imgs/extension/zorder-workflow.png | Bin 0 -> 49985 bytes docs/sql/index.rst | 1 + docs/sql/z-order-introduction.md | 121 ++++++++++++++++++++++++ 3 files changed, 122 insertions(+) create mode 100644 docs/imgs/extension/zorder-workflow.png create mode 100644 docs/sql/z-order-introduction.md diff --git a/docs/imgs/extension/zorder-workflow.png b/docs/imgs/extension/zorder-workflow.png new file mode 100644 index 0000000000000000000000000000000000000000..f38a28656157dc84da6e3806cf886272c62a0692 GIT binary patch literal 49985 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 literal 0 HcmV?d00001 diff --git a/docs/sql/index.rst b/docs/sql/index.rst index b8c894bf2fc..a3a89e2d464 100644 --- a/docs/sql/index.rst +++ b/docs/sql/index.rst @@ -27,5 +27,6 @@ This part describes the use of the SQL References in Kyuubi, including lists of rules functions + z-order-introduction z-order-benchmark diff --git a/docs/sql/z-order-introduction.md b/docs/sql/z-order-introduction.md new file mode 100644 index 00000000000..24a49990518 --- /dev/null +++ b/docs/sql/z-order-introduction.md @@ -0,0 +1,121 @@ + + +
+ +![](../imgs/kyuubi_logo.png) + +
+ +# Z-order introduction + +## Introduction + +The following picture shows the workflow of z-order. + +![](../imgs/extension/zorder-workflow.png) + +It contains three parties: +- Upstream + + Due to the extra sort, the upstream job will run a little slower than before + +- Table + + Z-order has the good data clustering, so the compression ratio can be improved + +- Downstream + + Improve the downstream read performance benefit from data skipping. Since the parquet and orc file support collect data statistic automatically when you write data e.g. minimum and maximum values, the good data clustering let the pushed down filter more efficient + +### Supported table format + +| Table Format | Supported | +|--------------|-----------| +| parquet | Y | +| orc | Y | +| json | N | +| csv | N | +| text | N | + +### Supported column data type + +| Column Data Type | Supported | +|------------------|-----------| +| byte | Y | +| short | Y | +| int | Y | +| long | Y | +| float | Y | +| double | Y | +| boolean | Y | +| string | Y | +| decimal | Y | +| date | Y | +| timestamp | Y | +| array | N | +| map | N | +| struct | N | +| udt | N | + +## How to use + +This feature is inside Kyuubi extension, so you should apply the extension to Spark by following steps. + +- add extension jar: `copy $KYUUBI_HOME/extension/kyuubi-extension-spark-3-1* $SPARK_HOME/jars/` +- add config into `spark-defaults.conf`: `spark.sql.extensions=org.apache.kyuubi.sql.KyuubiSparkSQLExtension` + +Due to the extension, z-order only works with Spark-3.1 and higher version. + +### Optimize history data + +If you want to optimize the history data of a table, the `OPTIMIZE ...` syntax is good to go. Due to Spark SQL doesn't support read and overwrite same datasource table, the syntax can only support to optimize Hive table. + +#### Syntax +```sql +OPTIMIZE table_name [WHERE predicate] ZORDER BY col_name1 [, ...] +``` + +Note that, the `predicate` only supports partition spec. + +#### Examples +```sql +OPTIMIZE t1 ZORDER BY c3; + +OPTIMIZE t1 ZORDER BY c1,c2; + +OPTIMIZE t1 WHERE day = '2021-12-01' ZORDER BY c1,c2; +``` + +### Optimize incremental data + +Kyuubi supports optimize a table automatically for incremental data. e.g., time partitioned table. The only things you need to do is adding Kyuubi properties into the target table properties: +```sql +ALTER TABLE t1 SET TBLPROPERTIES('kyuubi.zorder.enabled'='true','kyuubi.zorder.cols'='c1,c2'); +``` +- the key `kyuubi.zorder.enabled` decide if the table allows Kyuubi to optimize by z-order. +- the key `kyuubi.zorder.cols` decide which columns are used to optimize by z-order. + +Kyuubi will detect the properties and optimize SQL using z-order during SQL compilation, so you can enjoy z-order with all writing table command like: + +```sql +INSERT INTO TABLE t1 PARTITION() ...; + +INSERT OVERWRITE TABLE t1 PARTITION() ...; + +CREATE TABLE t1 AS SELECT ...; +```