+
+ 
+
+ 通过以上流程,分别创建部门表dept、员工表emp和分区员工表emp_partition,建表语句如下:
+
+```sql
+create external table if not exists default.dept(
+ deptno int,
+ dname string,
+ loc int
+)
+row format delimited fields terminated by '\t';
+
+create external table if not exists default.emp(
+ empno int,
+ ename string,
+ job string,
+ mgr int,
+ hiredate string,
+ sal double,
+ comm double,
+ deptno int
+)
+row format delimited fields terminated by '\t';
+
+create table if not exists emp_partition(
+ empno int,
+ ename string,
+ job string,
+ mgr int,
+ hiredate string,
+ sal double,
+ comm double,
+ deptno int
+)
+partitioned by (month string)
+row format delimited fields terminated by '\t';
+```
+
+**导入数据**
+
+目前需要通过后台手动批量导入数据,可以通过insert方法从页面插入数据
+
+```sql
+load data local inpath 'dept.txt' into table default.dept;
+load data local inpath 'emp.txt' into table default.emp;
+load data local inpath 'emp1.txt' into table default.emp_partition;
+load data local inpath 'emp2.txt' into table default.emp_partition;
+load data local inpath 'emp2.txt' into table default.emp_partition;
+```
+
+其它数据按照上述语句导入,样例数据文件路径在:`examples\ch3`
+
+## 2.2 基本SQL语法测试
+
+### 2.2.1 简单查询
+
+```sql
+select * from dept;
+```
+
+### 2.2.2 Join连接
+
+```sql
+select * from emp
+left join dept
+on emp.deptno = dept.deptno;
+```
+
+### 2.2.3 聚合函数
+
+```sql
+select dept.dname, avg(sal) as avg_salary
+from emp left join dept
+on emp.deptno = dept.deptno
+group by dept.dname;
+```
+
+### 2.2.4 内置函数
+
+```sql
+select ename, job,sal,
+rank() over(partition by job order by sal desc) sal_rank
+from emp;
+```
+
+### 2.2.5 分区表简单查询
+
+```sql
+show partitions emp_partition;
+select * from emp_partition where month='202001';
+```
+
+### 2.2.6 分区表联合查询
+
+```sql
+select * from emp_partition where month='202001'
+union
+select * from emp_partition where month='202002'
+union
+select * from emp_partition where month='202003'
+```
+
+## 2.3 UDF函数测试
+
+### 2.3.1 Jar包上传
+
+进入Scriptis页面后,右键目录路径上传jar包:
+
+ 
+
+测试样例jar包在`examples\ch3\rename.jar`
+
+### 4.3.2 自定义函数
+
+进入“UDF函数”选项(如1),右击“个人函数”目录,选择“新增函数”:
+
+
+
+输入函数名称、选择jar包、并填写注册格式、输入输出格式即可创建函数:
+
+ 
+
+
+
+获得的函数如下:
+
+ 
+
+### 4.3.3 利用自定义函数进行SQL查询
+
+完成函数注册后,可进入工作空间页面创建.hql文件使用函数:
+
+```sql
+select deptno,ename, rename(ename) as new_name
+from emp;
+```
diff --git a/docs/zh_CN/ch3/DSS_User_Tests3_SparkSQL.md b/docs/zh_CN/ch3/DSS_User_Tests3_SparkSQL.md
new file mode 100644
index 0000000000000000000000000000000000000000..aaf2fb44d7096e8de1b805145bd60cf43858c05f
--- /dev/null
+++ b/docs/zh_CN/ch3/DSS_User_Tests3_SparkSQL.md
@@ -0,0 +1,61 @@
+# DSS用户测试样例3:SparkSQL
+
+DSS用户测试样例的目的是为平台新用户提供一组测试样例,用于熟悉DSS的常见操作,并验证DSS平台的正确性
+
+
+
+## 3.1RDD与DataFrame转换
+
+### 3.1.1 RDD转为DataFrame
+
+```scala
+case class MyList(id:Int)
+
+val lis = List(1,2,3,4)
+
+val listRdd = sc.makeRDD(lis)
+import spark.implicits._
+val df = listRdd.map(value => MyList(value)).toDF()
+
+df.show()
+```
+
+### 3.1.2 DataFrame转为RDD
+
+```scala
+case class MyList(id:Int)
+
+val lis = List(1,2,3,4)
+val listRdd = sc.makeRDD(lis)
+import spark.implicits._
+val df = listRdd.map(value => MyList(value)).toDF()
+println("------------------")
+
+val dfToRdd = df.rdd
+
+dfToRdd.collect().foreach(print(_))
+```
+
+## 3.2 DSL语法风格实现
+
+```scala
+val df = df1.union(df2)
+val dfSelect = df.select($"department")
+dfSelect.show()
+```
+
+## 3.3 SQL语法风格实现(入口函数sqlContext)
+
+```scala
+val df = df1.union(df2)
+
+df.createOrReplaceTempView("dfTable")
+val innerSql = """
+ SELECT department
+ FROM dfTable
+ """
+val sqlDF = sqlContext.sql(innerSql)
+sqlDF.show()
+```
+
+
\ No newline at end of file
diff --git "a/docs/zh_CN/ch4/DSS\345\267\245\347\250\213\345\217\221\345\270\203\350\260\203\345\272\246\347\263\273\347\273\237\346\236\266\346\236\204\350\256\276\350\256\241.md" "b/docs/zh_CN/ch4/DSS\345\267\245\347\250\213\345\217\221\345\270\203\350\260\203\345\272\246\347\263\273\347\273\237\346\236\266\346\236\204\350\256\276\350\256\241.md"
new file mode 100644
index 0000000000000000000000000000000000000000..1dc37857d79463d5b48767c454edf0603d9dd401
--- /dev/null
+++ "b/docs/zh_CN/ch4/DSS\345\267\245\347\250\213\345\217\221\345\270\203\350\260\203\345\272\246\347\263\273\347\273\237\346\236\266\346\236\204\350\256\276\350\256\241.md"
@@ -0,0 +1,30 @@
+# DataSphere Studio发布调度系统架构设计
+
+
+
+## 一、背景
+
+ 目前在大数据领域存在许多种批量定时调度系统,如Azkaban、Airflow、EasyScheduler等,DSS支持将设计好的DAG工作流
+发布到不同的调度系统,系统默认支持了发布到Azkaban的实现。在DSS中主要完工作流的编排设计,节点的参数设置,
+脚本代码编写,图表设计等需要交互式的操作,还可以在DSS中实时执行,并调试好所有节点的可执行代码。发布到调度系统后
+,由调度系统根据定时任务的配置,定时调度执行。
+
+## 二、架构设计
+
+
+
+## 三、发布流程
+
+(1)从数据库读取最新版本的工程、工作流信息,获取所有的保存在BML库工作流JSON文件。
+
+(2)将上面的数据库内容,JSON文件内容分别转成DSS中的DSSProject,DSSFlow,如果存在子flow,则需要一并设置到flow中,保持原来的层级关系和依赖关系,构建好DSSProject,其中包含了工程下所有的DSSFlow。
+ 一个工作流JSON包含了所有节点的定义,并存储了节点之间的依赖关系,以及工作流自身的属性信息。
+
+(3)将DSSProject经过工程转换器转成SchedulerProject,转成SchedulerProject的过程中,同时完成了DSSJSONFlow到SchedulerFlow的转换,也完成了DSSNode到SchedulerNode的转换。
+
+(4)使用ProjectTuning对整个SchedulerProject工程进行tuning操作,用于完成工程发布前的整体调整操作,在Azkaban的实现中主要完成了工程的路径设置和工作流的存储路径设置。
+
+(5)ProjectPublishHook操作,hook可以根据不同的调度系统进行实现,且可分为发布前的hook和发布后的hook,这些都会被统一执行。
+ 发布前的hook包含对工程的解析,工作流的解析,节点的解析,以及生成对应的资源文件,属性文件,节点描述文件等。这个需要根据不同的调度系统进行实现。
+
+(6)发布工程,打包好经过转换、解析生成的工程目录文件,并上传到对应的调度系统。
diff --git "a/docs/zh_CN/ch4/\345\211\215\347\253\257\347\274\226\350\257\221\346\226\207\346\241\243.md" "b/docs/zh_CN/ch4/\345\211\215\347\253\257\347\274\226\350\257\221\346\226\207\346\241\243.md"
new file mode 100644
index 0000000000000000000000000000000000000000..ee447703af6eba7e0527c1909a2744df6de1f864
--- /dev/null
+++ "b/docs/zh_CN/ch4/\345\211\215\347\253\257\347\274\226\350\257\221\346\226\207\346\241\243.md"
@@ -0,0 +1,86 @@
+# 编译文档中文版
+
+## 启动流程
+
+### 一、安装Node.js
+将Node.js下载到电脑本地,安装即可。下载地址:[http://nodejs.cn/download/](http://nodejs.cn/download/) (建议使用最新的稳定版本)
+**该步骤仅第一次使用时需要执行。**
+
+### 二、安装项目
+在终端命令行中执行以下指令:
+
+```
+git clone ${ipAddress}
+cd DataSphereStudio/web
+npm install
+```
+
+指令简介:
+1. 将项目包从远程仓库拉取到电脑本地:git clone ${ipAddress}
+2. 进入项目包根目录:cd DataSphereStudio/web
+3. 安装项目所需依赖:npm install
+
+**该步骤仅第一次使用时需要执行。**
+
+### 三、配置
+您需要在代码中进行一些配置,如后端接口地址,后端socket地址等,如根目录下的.env.development文件:
+
+```
+// 后端接口地址
+VUE_APP_MN_CONFIG_PREFIX=http://yourIp:yourPort/yourPath
+// 后端socket地址
+VUE_APP_MN_CONFIG_SOCKET=/yourSocketPath
+```
+
+配置的具体解释可参考vue-cli官方文档:[环境变量和模式](https://cli.vuejs.org/zh/guide/mode-and-env.html#%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F%E5%92%8C%E6%A8%A1%E5%BC%8F)
+
+### 打包项目
+您可以通过在终端命令行执行以下指令对项目进行打包,生成压缩后的代码:
+
+```
+npm run build
+```
+
+该指令成功执行后,项目根目录下会出现一个名叫 “dist” 的文件夹,该文件夹即为打包好的代码。您可以直接将该文件夹放进您的静态服务器中。
+
+### 运行项目
+如果您想在本地浏览器上运行该项目并且改动代码查看效果,需要在终端命令行中执行以下指令:
+
+```
+npm run serve
+```
+
+在浏览器中(建议Chrome浏览器)通过链接访问应用:[http://localhost:8080/](http://localhost:8080/) .
+当您使用该方式运行项目时,您对代码的改动产生的效果,会动态体现在浏览器上。
+
+**注意:因为项目采用前后端分离开发,所以在本地浏览器上运行时,需要对浏览器进行设置跨域才能访问后端接口:**
+
+比如chrome浏览器:
+windows系统下的配置方式:
+1. 关闭所有的chrome浏览器。
+2. 新建一个chrome快捷方式,右键“属性”,“快捷方式”选项卡里选择“目标”,添加 --args --disable-web-security --user-data-dir=C:\MyChromeDevUserData
+3. 通过快捷方式打开chrome浏览器
+mac系统下的配置方式:
+在终端命令行执行以下命令(需要替换路径中的yourname,若还不生效请检查您机器上MyChromeDevUserData文件夹的位置并将路径复制到下面指令的“--user-data-dir=”后面)
+
+```
+open -n /Applications/Google\ Chrome.app/ --args --disable-web-security --user-data-dir=/Users/yourname/MyChromeDevUserData/
+```
+
+
+### 常见问题
+
+#### npm install无法成功
+如果遇到该情况,可以使用国内的淘宝npm镜像:
+
+```
+npm install -g cnpm --registry=https://registry.npm.taobao.org
+```
+
+接着,通过执行以下指令代替npm install指令
+
+```
+cnpm install
+```
+
+注意,项目启动和打包时,仍然可以使用npm run build和npm run serve指令
\ No newline at end of file
diff --git "a/docs/zh_CN/ch4/\345\246\202\344\275\225\346\216\245\345\205\245\350\260\203\345\272\246\347\263\273\347\273\237Azkaban.md" "b/docs/zh_CN/ch4/\345\246\202\344\275\225\346\216\245\345\205\245\350\260\203\345\272\246\347\263\273\347\273\237Azkaban.md"
new file mode 100644
index 0000000000000000000000000000000000000000..a6e307784e4e74eea88b3cba8fa97dc6b762c3d1
--- /dev/null
+++ "b/docs/zh_CN/ch4/\345\246\202\344\275\225\346\216\245\345\205\245\350\260\203\345\272\246\347\263\273\347\273\237Azkaban.md"
@@ -0,0 +1,42 @@
+## DSS如何手动安装接入调度系统Azkaban
+ Azkaban目前是作为一个SchedulerAppJoint在DSS-SERVER中使用,通过AzkabanSchedulerAppJoint实现了Azkaban的工程服务和安全认证服务,
+ 主要提供了工程的创建、更新、发布、删除,以及安全认证服务相关的代理登录,Cookie保存等。
+
+ **前提条件:用户已经安装部署好社区版Azkaban-3.X以上版本。**[如何安装Azkaban](https://github.com/azkaban/azkaban)
+#### **步骤:**
+**1、Azkaban APPJoint安装及配置**
+
+ 进入DSS安装包解压目录,复制share/appjoints/schedulis/dss-azkaban-appjoint.zip到DSS安装目录的dss-appjoints/schedulis文件夹下,解压即可。
+
+**2、修改dss-server配置目录中linkis.properties配置,增加如下参数:**
+
+```
+wds.dss.appjoint.scheduler.azkaban.address=http://IP地址:端口 #Azkaban的http地址
+wds.dss.appjoint.scheduler.project.store.dir=file:///appcom/tmp/wds/scheduler #Azkaban发布包临时存储目录
+```
+
+**3、数据库中dss_application表修改**
+
+ 修改DSS数据库dss_application表中schedulis记录行,修改url的连接IP地址和端口,保持与Azkaban Server实际地址一致。
+ 示例SQL:
+
+```
+INSERT INTO `dss_application` (`id`, `name`, `url`, `is_user_need_init`, `level`, `user_init_url`, `exists_project_service`, `project_url`, `enhance_json`, `if_iframe`, `homepage_url`, `redirect_url`) VALUES (NULL, 'schedulis', NULL, '0', '1', NULL, '0', NULL, NULL, '1', NULL, NULL);
+
+UPDATE `dss_application` SET url = 'http://IP地址:端口', project_url = 'http://IP地址:端口/manager?project=${projectName}',homepage_url = 'http://IP地址:端口/homepage' WHERE `name` in
+ ('schedulis');
+```
+
+**4、Azkaban JobType插件安装**
+
+您还需为Azkaban安装一个JobType插件: linkis-jobtype,请点击[Linkis jobType安装文档](https://github.com/WeBankFinTech/DataSphereStudio/blob/master/docs/zh_CN/ch2/Azkaban_LinkisJobType_Deployment_Manual.md)
+
+**5、用户token配置**
+
+##### 请在DSS-SERVER服务conf目录的token.properties文件中,配置用户名和密码信息,关联DSS和Azkaban用户,因为用户通过DSS创建工程后,要发布到azkaban,用户必须保持一致。示例:
+
+```
+ 用户名=密码
+```
+
+说明:由于每个公司都有各自的登录认证系统,这里只提供简单实现,用户可以实现SchedulerSecurityService定义自己的登录认证方法。azkaban用户管理可参考[Azkaban-3.x 用户管理](https://cloud.tencent.com/developer/article/1492734)及[官网](https://azkaban.readthedocs.io/en/latest/userManager.html)
diff --git "a/docs/zh_CN/ch4/\347\254\254\344\270\211\346\226\271\347\263\273\347\273\237\346\216\245\345\205\245DSS\346\214\207\345\215\227.md" "b/docs/zh_CN/ch4/\347\254\254\344\270\211\346\226\271\347\263\273\347\273\237\346\216\245\345\205\245DSS\346\214\207\345\215\227.md"
index 73173626eb6de9a37ba75a3fd1aa4689521649c7..690682aabe2a6e3fe74111757bbbaf47a69fbd9e 100644
--- "a/docs/zh_CN/ch4/\347\254\254\344\270\211\346\226\271\347\263\273\347\273\237\346\216\245\345\205\245DSS\346\214\207\345\215\227.md"
+++ "b/docs/zh_CN/ch4/\347\254\254\344\270\211\346\226\271\347\263\273\347\273\237\346\216\245\345\205\245DSS\346\214\207\345\215\227.md"
@@ -31,28 +31,142 @@
NodeService是用来解决用户在DSS提交的任务在第三方系统生成相应的任务的问题。用户如果在DSS系统的工作流中新建了一个工作流节点并进行任务的编辑,第三方系统需要同步感知到
- 4.getNodeExecution
- NodeExecution接口是用来将任务提交到第三方系统进行执行的接口,NodeExecution接口有支持短时间任务的NodeExecution和支持长时间任务的LongTermNodeExecution。一般短时间任务,如邮件发送等,可以直接实现NodeExecution接口,并重写execute方法,DSS系统同步等待任务结束。另外的长时间任务,如数据质量检测等,可以实现LongTermNodeExecution接口,并重写submit方法,返回一个NodeExecutionAction,DSS系统通过这个NodeExecutionAction可以向第三方系统获取任务的日志、状态等。
+ NodeExecution接口是用来将任务提交到第三方系统进行执行的接口,NodeExecution
+接口有支持短时间任务的NodeExecution和支持长时间任务的LongTermNodeExecution。一般短时间任务,如邮件发送等,可以直接实现NodeExecution接口,并重写execute方法,DSS系统同步等待任务结束。另外的长时间任务,如数据质量检测等,可以实现LongTermNodeExecution接口,并重写submit方法,返回一个NodeExecutionAction,DSS系统通过这个NodeExecutionAction可以向第三方系统获取任务的日志、状态等。
#### 3.第三方系统接入DSS的实现(以Visualis为例)
- Visualis是微众银行WeDataSphere开源的一款商业BI工具,DSS集成Visualis系统之后可以获得数据可视化的能力。Visualis接入DSS系统的代码在DSS项目中已经同步开源,下面将以开源代码为例,对步骤进行罗列分析。
+ Visualis是微众银行WeDataSphere开源的一款商业BI工具,DSS集成Visualis系统之后可以获得数据可视化的能力。
+Visualis接入DSS系统的代码在DSS项目中已经同步开源,下面将以开源代码为例,对步骤进行罗列分析。
Visualis接入的DSS系统的步骤如下:
**3.1.Visualis实现AppJoint接口**
- Visualis实现的 AppJoint接口的实现类是VisualisAppjoint。查看VisualisAppjoint的代码可知,它在init方法时候,初始化了自己实现的SecurityService、 NodeService以及NodeExecution。
+ Visualis实现的 AppJoint接口的实现类是VisualisAppjoint。查看VisualisAppjoint的代码可知,它在init方法时候,
+初始化了自己实现的SecurityService、 NodeService以及NodeExecution。
+```java
+ public void init(String baseUrl, Map