
# 创建并提交SQL作业
#### SQL编辑器简介
DLI提供SQL作业编辑器，用于使用SQL语句执行数据查询操作。
DLI的SQL编辑器支持SQL2003，兼容SparkSQL，可以批量执行SQL语句。且作业编辑窗口常用语法采用不同颜色突出显示。支持单行注释和多行注释（以"--"开头，后续内容即为注释。），更多语法描述请参见[《数据湖探索SQL语法参考》](https://support.huaweicloud.com/sqlref-spark-dli/dli_08_0219.html)。
本节内容介绍使用DLI的SQL编辑器创建并提交SQL作业的操作步骤。
#### 使用须知
- 提交SQL作业前请先配置DLI作业桶，该桶用于存储作业结果，以及使用DLI服务产生的临时数据如作业日志等。
  - 作业桶配置操作可参考[配置DLI作业桶](https://support.huaweicloud.com/usermanual-dli/dli_01_0536.html)。作业桶名称为系统默认。
  
  - 如果您的SQL队列已开启作业结果保存至DLI作业桶，系统会在运行SQL作业时把结果直接写到您指定的 OBS 桶里，请在提交作业前完成以下准备工作：
    - 请在提交SQL作业前配置DLI作业桶信息，否则SQL作业可能会提交失败。
    
    - 请确保执行SQL作业的用户具备该DLI作业桶的读写权限，否则无法正常保存和读取作业结果。 在执行作业时系统会使用提交作业的用户的身份凭证访问作业桶，如果权限不足就会导致保存或读取作业结果失败。
      
    
    
    了解更多：[怎样查看SQL队列是否已开启作业结果保存至DLI作业桶？](https://support.huaweicloud.com/usermanual-dli/dli_01_0563.html)
    
  
  - 在OBS管理控制台页面通过配置桶的生命周期规则，可以实现定时删除OBS桶中的对象或者定时转换对象的存储类别。 具体操作请参考[配置生命周期规则](https://support.huaweicloud.com/usermanual-obs/obs_03_0335.html)。
    
   
 
#### 使用SQL编辑器创建并提交SQL作业
1. 登录[DLI管理控制台](https://console.huaweicloud.com/dli/)。
2. 选择"SQL编辑器"页面。 进入"SQL编辑器"页面后，系统会提示"创建DLI临时数据桶"，用于存储使用DLI服务产生的临时数据。作业桶配置操作可参考[配置DLI作业桶](https://support.huaweicloud.com/usermanual-dli/dli_01_0536.html)。
   
3. 在SQL作业编辑窗口右上方的依次选择执行SQL作业所需的队列、数据库等信息，详细参数说明请参考[表1]。
    表1配置SQL作业信息 
   | 按键\&下拉列 | 描述                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
   |:---|:---|
   | 执行引擎    | 当前DLI支持选择Spark引擎。 了解更多DLI引擎的基本概念请参考[DLI计算引擎](https://support.huaweicloud.com/productdesc-dli/dli_01_0378.html)。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
   | 队列      | 队列用于指定SQL作业执行的资源队列。 队列决定了作业在弹性资源池中运行时能够使用的计算资源。每个队列都分配了指定的资源，即队列的CU，队列的CU配置直接影响作业的性能和执行效率。 在提交作业前，评估作业的资源需求，选择一个能够满足需求的队列。 SQL作业只能在队列类型为"SQL队列"下执行。 如果没有可用队列，您可以选择重新创建队列或者使用"default"队列： - 创建队列可以参考[创建弹性资源池并添加队列](https://support.huaweicloud.com/usermanual-dli/dli_01_0505.html)。  - default队列适合不确定数据量大小或仅需要偶尔进行数据处理的临时或测试项目场景。   |
   | 数据目录    | 数据目录（Catalog）是元数据管理对象，它可以包含多个数据库。 了解更多数据目录相关信息请参考[了解数据目录、数据库和表](https://support.huaweicloud.com/usermanual-dli/dli_01_0228.html)。 您可以在DLI中创建并管理多个Catalog，用于不同的元数据隔离。                                                                                                                                                                                                                                                                                                                                                                                                                        |
   | 数据库     | 下拉选择需要使用的数据库。 如果没有可用数据库，此处显示"default"默认数据库。 数据库创建操作详见[在DLI控制台创建数据目录、数据库和表](https://support.huaweicloud.com/usermanual-dli/dli_01_0005.html)。 如果SQL语句中指定了表所在的数据库，则此处选择的数据库无效。                                                                                                                                                                                                                                                                                                                                                                                |
   | 设置      | 包括设置"参数设置"和"标签"。 参数设置：以"key/value"的形式设置提交SQL作业的配置项。详细内容请参见《[数据湖探索SQL语法参考](https://support.huaweicloud.com/sqlref-spark-dli/dli_08_0266.html)》。 标签：以"key/value"的形式设置SQL作业的标签。                                                                                                                                                                                                                                                                                                                                                                                                                   |
      
   
4. 创建数据库和表。 您可以参考[在DLI控制台创建数据目录、数据库和表](https://support.huaweicloud.com/usermanual-dli/dli_01_0005.html)提前创建数据库和表。例如本例创建表，表名为"qw"。
   
5. 在SQL作业编辑窗口输入表"qw"的SQL查询语句：
   ```
   SELECT * FROM qw.qw LIMIT 10;
   ```
   或者双击左侧表名"qw"，上述查询语句会自动在作业编辑窗口中输入。
   DLI还为您提供了丰富的SQL模板，每种模板都为您提供了使用场景、代码示例和使用指导。您也可以直接使用SQL作业模板快速实现您的业务逻辑。了解模板更多信息请参考[创建SQL作业模板](https://support.huaweicloud.com/usermanual-dli/dli_01_0021.html)。
   
6. 单击"更多"中的"语法校验"，确认SQL语句书写是否正确。
   1. 如果语法校验失败，请参考[《数据湖探索SQL语法参考》](https://support.huaweicloud.com/sqlref-spark-dli/dli_08_0219.html)检查SQL语句准确性。
   
   2. 如果语法校验通过，单击"执行"，阅读并同意隐私协议，单击"确定"后执行SQL语句。
   
   
   SQL语句执行成功后，在SQL作业编辑窗口下方会显示执行结果。
   
7. 查看作业执行结果。 在查看结果页签，单击![](https://support.huaweicloud.com/usermanual-dli/zh-cn_image_0000002031969193.png "点击放大")以图形形式呈现查询结果。再单击![](https://support.huaweicloud.com/usermanual-dli/zh-cn_image_0000002031849645.png "点击放大")切换回表格形式。
   当前控制台界面查询结果最多显示1000条数据，如果需要查看更多或者全量数据，则可以单击![](https://support.huaweicloud.com/usermanual-dli/zh-cn_image_0000001209489750.png "点击放大")将数据导出到OBS获取。
   ![](https://support.huaweicloud.com/usermanual-dli/public_sys-resources/note_3.0-zh-cn.png)
   - 如果执行结果中无数值列，则无法进行图形化。
   
   - 图形类型包括柱状图、折线图、扇形图。
   
   - 柱状图和折线图的X轴可为任意一列，Y轴仅支持数值类型的列，扇形图对应图例和指标。
     
 
#### SQL作业参数设置
单击SQL编辑器页面右上方的"设置"按钮。可以设置SQL作业运行参数和作业标签。
- 参数设置：以"key/value"的形式设置提交SQL作业的配置项。 详细内容请参见《[数据湖探索SQL语法参考](https://support.huaweicloud.com/sqlref-spark-dli/dli_08_0266.html)》。
  
  
- 标签：以"key/value"的形式设置SQL作业的标签。
表2SQL作业运行参数配置说明 
| 参数名称                                        | 默认值       | 描述                                                                                                                                                                                                          |
|:---|:---|:---|
| spark.sql.files.maxRecordsPerFile           | 0         | 要写入单个文件的最大记录数。如果该值为零或为负，则没有限制。                                                                                                                                                                              |
| spark.sql.autoBroadcastJoinThreshold        | 209715200 | 配置执行连接时显示所有工作节点的表的最大字节大小。通过将此值设置为"-1"，可以禁用显示。 说明： 当前仅支持运行命令ANALYZE TABLE COMPUTE statistics noscan的配置单元存储表，和直接根据数据文件计算统计信息的基于文件的数据源表。           |
| spark.sql.shuffle.partitions                | 200       | 为连接或聚合过滤数据时使用的默认分区数。                                                                                                                                                                                        |
| spark.sql.dynamicPartitionOverwrite.enabled | false     | 当前配置设置为"false"时，DLI在覆盖写之前，会删除所有符合条件的分区。例如，分区表中有一个"2021-01"的分区，当使用INSERT OVERWRITE语句向表中写入"2021-02"这个分区的数据时，会把"2021-01"的分区数据也覆盖掉。 当前配置设置为"true"时，DLI不会提前删除分区，而是在运行时覆盖那些有数据写入的分区。 |
| spark.sql.files.maxPartitionBytes           | 134217728 | 读取文件时要打包到单个分区中的最大字节数。                                                                                                                                                                                       |
| spark.sql.badRecordsPath                    | -         | Bad Records的路径。                                                                                                                                                                                             |
| dli.sql.sqlasync.enabled                    | true      | DDL和DCL语句是否异步执行，值为"true"时启用异步执行。                                                                                                                                                                            |
| dli.sql.job.timeout                         | -         | 设置作业运行超时时间，超时取消。单位：秒。                                                                                                                                                                                       |
   
#### 更多SQL编辑器常用功能
- **跳转至SparkUI查看SQL语句执行进程**
  SQL编辑器页面提供了跳转至SparkUI查看SQL语句执行进程的功能。
  - 目前DLI配置SparkUI只展示最新的100条作业信息。
  
  - default队列下运行的作业或者该作业为同步作业时不支持跳转至SparkUI查看SQL语句执行进程。
  
  
  ![](https://support.huaweicloud.com/usermanual-dli/public_sys-resources/note_3.0-zh-cn.png)
  新建队列，运行作业时会重新拉集群，大概需要10分钟左右才能拉好集群，在集群创建好之前单击SparkUI会导致缓存空的projectID，从而导致无法查看SparkUI。建议使用专属队列，集群不会被释放，就不会有该问题，或者提交作业后等一段时间再查看SparkUI，确保集群已经拉好了，不要立即单击SparkUI。
  
- **归档SQL运行日志**
  单击SQL编辑器页面，执行历史中SQL作业操作列下的"更多 \> 归档日志"，系统自动跳转至日志存储的OBS路径。您可以按需下载对应的日志使用。
  ![](https://support.huaweicloud.com/usermanual-dli/public_sys-resources/note_3.0-zh-cn.png)
  default队列下运行的作业或者该作业为同步作业时不支持归档日志操作。
  
- **SQL编辑器快捷功能**
  表3快捷键说明 
  | 快捷键         | 描述                                             |
  |:---|:---|
  | Ctrl+Enter  | 执行SQL。通过按下键盘上的Ctrl+R或Ctrl + Enter，您可以执行SQL语句。  |
  | Ctrl+F      | 搜索SQL。通过按下键盘上的Ctrl + F，您可以搜索需要的SQL语句。          |
  | Shift+Alt+F | 格式化SQL。通过按下键盘上的Shift+Alt+F，您可以将SQL语句格式化。       |
  | Ctrl+Q      | 语法校验。通过按下键盘上的Ctrl + Q，您可以对SQL语句进行语法校验。         |
  | F11         | 全屏。通过按下键盘上的F11，您可将SQL作业编辑器窗口全屏。再次按下F11，将从全屏复原。 |
     
  
 
