- 最新动态
- 功能总览
- 服务公告
- 产品介绍
- 计费说明
- 快速入门
-
用户指南
- DLI作业开发流程
- 准备工作
- 创建弹性资源池和队列
- 创建数据库和表
- 数据迁移与数据传输
- 配置DLI访问其他云服务的委托权限
- 使用DLI提交SQL作业
- 使用DLI提交Flink作业
- 使用DLI提交Spark作业
- 使用Notebook实例提交DLI作业
- 使用CES监控DLI服务
- 使用AOM监控DLI服务
- 使用CTS审计DLI服务
- 权限管理
- DLI常用管理操作
- 最佳实践
-
开发指南
- 使用客户端工具连接DLI
- SQL作业开发指南
- Flink作业开发指南
- Spark Jar作业开发指南
-
语法参考
-
Spark SQL语法参考
- Spark SQL常用配置项说明
- Spark SQL语法概览
- Spark开源命令支持说明
- 数据库相关
- 表相关
- 数据相关
- 导出查询结果
- 跨源连接相关
- 视图相关
- 查看计划
- 数据权限相关
- 数据类型
- 自定义函数
-
内置函数
-
日期函数
- 日期函数概览
- add_months
- current_date
- current_timestamp
- date_add
- dateadd
- date_sub
- date_format
- datediff
- datediff1
- datepart
- datetrunc
- day/dayofmonth
- from_unixtime
- from_utc_timestamp
- getdate
- hour
- isdate
- last_day
- lastday
- minute
- month
- months_between
- next_day
- quarter
- second
- to_char
- to_date
- to_date1
- to_utc_timestamp
- trunc
- unix_timestamp
- weekday
- weekofyear
- year
-
字符串函数
- 字符串函数概览
- ascii
- concat
- concat_ws
- char_matchcount
- encode
- find_in_set
- get_json_object
- instr
- instr1
- initcap
- keyvalue
- length
- lengthb
- levenshtein
- locate
- lower/lcase
- lpad
- ltrim
- parse_url
- printf
- regexp_count
- regexp_extract
- replace
- regexp_replace
- regexp_replace1
- regexp_instr
- regexp_substr
- repeat
- reverse
- rpad
- rtrim
- soundex
- space
- substr/substring
- substring_index
- split_part
- translate
- trim
- upper/ucase
- 数学函数
- 聚合函数
- 分析窗口函数
- 其他函数
-
日期函数
- SELECT
-
标示符
- aggregate_func
- alias
- attr_expr
- attr_expr_list
- attrs_value_set_expr
- boolean_expression
- class_name
- col
- col_comment
- col_name
- col_name_list
- condition
- condition_list
- cte_name
- data_type
- db_comment
- db_name
- else_result_expression
- file_format
- file_path
- function_name
- groupby_expression
- having_condition
- hdfs_path
- input_expression
- input_format_classname
- jar_path
- join_condition
- non_equi_join_condition
- number
- num_buckets
- output_format_classname
- partition_col_name
- partition_col_value
- partition_specs
- property_name
- property_value
- regex_expression
- result_expression
- row_format
- select_statement
- separator
- serde_name
- sql_containing_cte_name
- sub_query
- table_comment
- table_name
- table_properties
- table_reference
- view_name
- view_properties
- when_expression
- where_condition
- window_function
- 运算符
-
Flink SQL语法参考
- Flink Opensource SQL1.15语法参考
- Flink Opensource SQL1.12语法参考
- Flink Opensource SQL1.10语法参考
-
HetuEngine SQL语法参考
-
HetuEngine SQL语法
- 使用前必读
- 数据类型
-
DDL 语法
- CREATE SCHEMA
- CREATE TABLE
- CREATE TABLE AS
- CREATE TABLE LIKE
- CREATE VIEW
- ALTER TABLE
- ALTER VIEW
- ALTER SCHEMA
- DROP SCHEMA
- DROP TABLE
- DROP VIEW
- TRUNCATE TABLE
- COMMENT
- VALUES
- SHOW语法使用概要
- SHOW SCHEMAS(DATABASES)
- SHOW TABLES
- SHOW TBLPROPERTIES TABLE|VIEW
- SHOW TABLE/PARTITION EXTENDED
- SHOW FUNCTIONS
- SHOW PARTITIONS
- SHOW COLUMNS
- SHOW CREATE TABLE
- SHOW VIEWS
- SHOW CREATE VIEW
- DML 语法
- DQL 语法
- 辅助命令语法
- 预留关键字
- SQL函数和操作符
- 数据类型隐式转换
- 附录
-
HetuEngine SQL语法
- Hudi SQL语法参考
- Delta SQL语法参考
-
Spark SQL语法参考
-
API参考
- API使用前必读
- API概览
- 如何调用API
- API快速入门
- 权限相关API
- 全局变量相关API
- 资源标签相关API
- 增强型跨源连接相关API
- 跨源认证相关API
- 弹性资源池相关API
- 队列相关API(推荐)
- SQL作业相关API
- SQL模板相关API
- Flink作业相关API
- Flink作业模板相关API
- Flink作业管理相关API
- Spark作业相关API
- Spark作业模板相关API
- 权限策略和授权项
- 历史API
- 公共参数
- SDK参考
- 场景代码示例
-
常见问题
- DLI产品咨询类
- DLI弹性资源池和队列类
-
DLI数据库和表类
- 为什么在DLI控制台中查询不到表?
- OBS表压缩率较高怎么办?
- 字符码不一致导致数据乱码怎么办?
- 删除表后再重新创建同名的表,需要对操作该表的用户和项目重新赋权吗?
- DLI分区内表导入的文件不包含分区列的数据,导致数据导入完成后查询表数据失败怎么办?
- 创建OBS外表,由于OBS文件中的某字段存在换行符导致表字段数据错误怎么办?
- join表时没有添加on条件,造成笛卡尔积查询,导致队列资源爆满,作业运行失败怎么办?
- 手动在OBS表的分区目录下添加了数据,但是无法查询到数据怎么办?
- 为什么insert overwrite覆盖分区表数据的时候,覆盖了全量数据?
- 跨源连接RDS表中create_date字段类型是datetime,为什么DLI中查出来的是时间戳呢?
- SQL作业执行完成后,修改表名导致datasize不正确怎么办?
- 从DLI导入数据到OBS,数据量不一致怎么办?
-
增强型跨源连接类
- 增强型跨源连接绑定队列失败怎么办?
- DLI增强型跨源连接DWS失败怎么办?
- 创建跨源成功但测试网络连通性失败怎么办?
- 怎样配置DLI队列与数据源的网络连通?
- 为什么DLI增强型跨源连接要创建对等连接?
- DLI创建跨源连接,绑定队列一直在创建中怎么办?
- 新建跨源连接,显示已激活,但使用时提示communication link failure错误怎么办?
- 跨源访问MRS HBase,连接超时,日志未打印错误怎么办?
- DLI跨源连接报错找不到子网怎么办?
- 跨源RDS表,执行insert overwrite提示Incorrect string value错误怎么办?
- 创建RDS跨源表提示空指针错误怎么办?
- 对跨源DWS表执行insert overwrite操作,报错:org.postgresql.util.PSQLException: ERROR: tuple concurrently updated
- 通过跨源表向CloudTable Hbase表导入数据,executor报错:RegionTooBusyException
- 通过DLI跨源写DWS表,非空字段出现空值异常怎么办?
- 更新跨源目的端源表后,未同时更新对应跨源表,导致insert作业失败怎么办?
- RDS表有自增主键时怎样在DLI插入数据?
-
SQL作业类
- SQL作业开发类
-
SQL作业运维类
- 用户导表到OBS报“path obs://xxx already exists”错误
- 对两个表进行join操作时,提示:SQL_ANALYSIS_ERROR: Reference 't.id' is ambiguous, could be: t.id, t.id.;
- 执行查询语句报错:The current account does not have permission to perform this operation,the current account was restricted. Restricted for no budget.
- 执行查询语句报错:There should be at least one partition pruning predicate on partitioned table XX.YYY
- LOAD数据到OBS外表报错:IllegalArgumentException: Buffer size too small. size
- SQL作业运行报错:DLI.0002 FileNotFoundException
- 用户通过CTAS创建hive表报schema解析异常错误
- 在DataArts Studio上运行DLI SQL脚本,执行结果报org.apache.hadoop.fs.obs.OBSIOException错误
- 使用CDM迁移数据到DLI,迁移作业日志上报UQUERY_CONNECTOR_0001:Invoke DLI service api failed错误
- SQL作业访问报错:File not Found
- SQL作业访问报错:DLI.0003: AccessControlException XXX
- SQL作业访问外表报错:DLI.0001: org.apache.hadoop.security.AccessControlException: verifyBucketExists on {{桶名}}: status [403]
- 执行SQL语句报错:The current account does not have permission to perform this operation,the current account was restricted. Restricted for no budget.
-
Flink作业类
- Flink作业咨询类
-
Flink SQL作业类
- 怎样将OBS表映射为DLI的分区表?
- Flink SQL作业Kafka分区数增加或减少,怎样不停止Flink作业实现动态感知?
- 在Flink SQL作业中创建表使用EL表达式,作业运行提示DLI.0005错误怎么办?
- Flink作业输出流写入数据到OBS,通过该OBS文件路径创建的DLI表查询无数据
- Flink SQL作业运行失败,日志中有connect to DIS failed java.lang.IllegalArgumentException: Access key cannot be null错误
- Flink SQL作业消费Kafka后sink到es集群,作业执行成功,但未写入数据
- Flink Opensource SQL如何解析复杂嵌套 JSON?
- Flink Opensource SQL从RDS数据库读取的时间和RDS数据库存储的时间为什么会不一致?
- Flink Opensource SQL Elasticsearch结果表failure-handler参数填写retry_rejected导致提交失败
- Kafka Sink配置发送失败重试机制
- 如何在一个Flink作业中将数据写入到不同的Elasticsearch集群中?
- 作业语义检验时提示DIS通道不存在怎么处理?
- Flink jobmanager日志一直报Timeout expired while fetching topic metadata怎么办?
- Flink Jar作业类
- Flink作业性能调优类
-
Spark作业相类
- Spark作业开发类
-
Spark作业运维类
- 运行Spark作业报java.lang.AbstractMethodError
- Spark作业访问OBS数据时报ResponseCode: 403和ResponseStatus: Forbidden错误
- 有访问OBS对应的桶的权限,但是Spark作业访问时报错 verifyBucketExists on XXXX: status [403]
- Spark作业运行大批量数据时上报作业运行超时异常错误
- 使用Spark作业访问sftp中的文件,作业运行失败,日志显示访问目录异常
- 执行作业的用户数据库和表权限不足导致作业运行失败
- 为什么Spark3.x的作业日志中打印找不到global_temp数据库
- 在使用Spark2.3.x访问元数据时,DataSource语法创建avro类型的OBS表创建失败
- DLI资源配额类
- DLI权限管理类
- DLI API类
- 视频帮助
- 文档下载
- 通用参考
链接复制成功!
在DataArts Studio开发DLI SQL作业
操作场景
华为云数据治理中心DataArts Studio提供了一站式数据治理平台,可以实现与DLI服务的对接,从而提供统一的数据集成、数据开发服务,方便企业对全部数据进行管控。
本节操作介绍在DataArts Studio开发DLI SQL作业的操作步骤。
开发流程

- 环境准备:准备执行作业所需的DLI资源和DataArts Studio资源。请参考环境准备。
- 创建数据库和表:提交SQL脚本创建数据库和表。请参考步骤1:创建数据库和表。
- 导入业务数据:提交SQL脚本导入业务数据。请参考步骤2:业务数据的计算与处理。
- 数据查询与分析:提交SQL脚本分析业务数据,例如查询单日销售情况。请参考步骤3:销售情况的查询与分析。
- 作业编排:将数据处理和数据分析脚本编排成一个pipeline。DataArts会按照编排好的pipeline顺序执行各个节点。请参考步骤4:作业编排。
- 测试作业运行:测试作业运行。请参考步骤5:测试作业运行。
- 设置作业调度与监控:设置作业调度属性与监控规则。请参考步骤6:设置作业周期调度和相关操作。
环境准备
- DLI资源环境准备
- 配置DLI作业桶
使用DLI服务前需配置DLI作业桶,该桶用于存储DLI作业运行过程中产生的临时数据,例如:作业日志、作业结果。具体操作请参考:配置DLI作业桶。
- 创建弹性资源池并添加SQL队列
弹性资源池为DLI作业运行提供所需的计算资源(CPU和内存),用于灵活应对业务对计算资源变化的需求。
创建弹性资源池后,您可以在弹性资源池中创建多个队列,队列关联到具体的作业和数据处理任务,是资源池中资源被实际使用和分配的基本单元,即队列是执行作业所需的具体的计算资源。
同一弹性资源池中,队列之间的计算资源支持共享。 通过合理设置队列的计算资源分配策略,可以提高计算资源利用率。
具体操作请参考:创建弹性资源池并添加队列。
- 配置DLI作业桶
- DataArts Studio资源环境准备
- 购买DataArts Studio实例
在使用DataArts Studio提交DLI作业前,需要先购买DataArts Studio实例。
具体操作请参考购买DataArts Studio基础包。
- 进入DataArts Studio实例空间
- 购买DataArts Studio实例
步骤1:创建数据库和表
- 开发创建数据库和表的SQL脚本
数据库和表是SQL作业开发的基础,在执行作业前您需要根据业务场景定义数据库和表。
本节操作介绍提交SQL脚本创建数据库和表的操作步骤。
- 在DataArts Studio数据开发页面,选择左侧导航栏的“数据开发 > 脚本开发”。
- 单击“新建DLI SQL脚本”。
图5 新建DLI SQL脚本
- 在脚本编辑页面输入创建数据库和表的示例代码。
1 2 3 4 5 6
```SQL -- 创建数据库 CREATE DATABASE IF not EXISTS supermarket_db;-- 创建商品维表 CREATE TABLE IF not EXISTS supermarketdb.products ( productid INT, -- 商品编号 productname STRING, -- 商品名称 category STRING, -- 商品类别 price DECIMAL(10,2) -- 单价 ) using parquet;-- 创建交易表 CREATE TABLE IF not EXISTS supermarketdb.transactions (transactionid INT, -- 交易编号 productid INT, -- 商品编号 quantity INT, -- 数量 dt STRING -- 日期 ) using parquet partitioned by (dt);-- 创建销售分析表 CREATE TABLE IF not EXISTS supermarketdb.analyze (transactionid INT, -- 交易编号 productid INT, -- 商品编号 productname STRING, -- 商品名称 quantity INT, -- 数量 dt STRING -- 日期 ) using parquet partitioned by (dt); ```
- 单击“保存”,保存SQL脚本,本例定义脚本名称为 create_tables。
- 单击“提交”按钮执行脚本创建数据库和表。
- 创建SQL作业运行脚本
- 在DataArts Studio数据开发页面,选择左侧导航栏的“数据开发 > 作业开发”。
图6 新建作业
- 编辑作业信息,本例定义SQL作业名称为 “job_create_tables”。
图7 编辑作业信息
- 在作业开发页面,拖动DLI SQL节点到画布中,并单击节点编辑属性。
- SQL或脚本:本例选择“SQL脚本”。并选择2.b中创建的脚本。
- 数据库名称:选择SQL脚本中设置的数据库。
- 队列名称:选择步骤▪创建弹性资源池并添加SQL队列中创建的SQL队列。
更多属性参数配置请参考DLI SQL属性参数说明。
图8 编辑DLI SQL节点属性 - 属性编辑完成后,单击“保存”,保存属性配置信息。
- 在DataArts Studio数据开发页面,选择左侧导航栏的“数据开发 > 作业开发”。
- 配置作业调度
由于创建库表只需要执行一次,所以本示例只设置为单次调度。
步骤2:业务数据的计算与处理
- 开发导入业务数据的SQL脚本
本节操作介绍提交SQL脚本导入业务数据的操作步骤。
- 在DataArts Studio数据开发页面,选择左侧导航栏的“数据开发 > 脚本开发”。
- 单击“新建DLI SQL脚本”。
图10 新建DLI SQL脚本
- 在脚本编辑页面输入分析数据的示例代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
SQL -- 实际业务中数据一般来自其他数据源,本示例简化了数据入库逻辑,模拟插入商品数据。 INSERT INTO supermarketdb.products (productid, productname, category, price) VALUES (1001, '洗发水', '日用品', 39.90), (1002, '牙膏', '日用品', 15.90), (1003, '方便面', '食品', 4.50), (1004, '可乐', '饮料', 3.50); -- 实际业务中数据一般来自其他数据源,本示例简化了数据入库逻辑,模拟插入交易记录。 INSERT INTO supermarketdb.transactions (transactionid, productid, quantity, dt) VALUES (1, 1001, 50, '2024-11-01'), -- 销售50瓶洗发水 (2, 1002, 100, '2024-11-01'), -- 销售100支牙膏 (3, 1003, 30, '2024-11-02'), -- 销售30包方便面 (4, 1004, 24, '2024-11-02'); -- 销售24瓶可乐 -- 模拟超市业务分析,查询某个商品的交易记录 INSERT INTO supermarketdb.analyze SELECT t.transactionid, t.productid, p.productname, t.quantity, t.dt FROM supermarketdb.transactions t JOIN supermarketdb.products p ON t.productid = p.productid WHERE t.dt = '2024-11-01';
- 单击“保存”,保存SQL脚本,本例定义脚本名称为 job_process_data。
- 单击“提交”执行脚本。
- 创建SQL作业
- 在DataArts Studio数据开发页面,选择左侧导航栏的“数据开发 > 作业开发”。
图11 新建作业
- 编辑作业信息,本例定义SQL作业名称为 “job_process_data”。
图12 编辑作业信息
- 在作业开发页面,拖动DLI SQL节点到画布中,并单击节点编辑属性。
- SQL或脚本:本例选择“SQL脚本”。并选择1中创建的脚本。
- 数据库名称:选择SQL脚本中设置的数据库。
- 队列名称:选择步骤▪创建弹性资源池并添加SQL队列中创建的SQL队列。
- 环境变量:"DLI环境变量" 为可选项。
spark.sql.optimizer.dynamicPartitionPruning.enabled = true
- 该配置项用于启用或禁用动态分区修剪。在执行SQL查询时,动态分区修剪可以帮助减少需要扫描的数据量,提高查询性能。
- 配置为true时,代表启用动态分区修剪,SQL会在查询中自动检测并删除那些不满足WHERE子句条件的分区,适用于在处理具有大量分区的表时。
- 如果SQL查询中包含大量的嵌套left join操作,并且表有大量的动态分区时,这可能会导致在数据解析时消耗大量的内存资源,导致Driver节点的内存不足,并触发频繁的Full GC。
- 在这种情况下,可以配置该参数为false即禁用动态分区修剪优化,有助于减少内存使用,避免内存溢出和频繁的Full GC。
但禁用此优化可能会降低查询性能,禁用后Spark将不会自动修剪掉那些不满足条件的分区。
更多属性参数配置请参考DLI SQL属性参数说明。
图13 编辑DLI SQL节点属性 - 属性编辑完成后,单击“保存”,保存属性配置信息。
- 在DataArts Studio数据开发页面,选择左侧导航栏的“数据开发 > 作业开发”。
步骤3:销售情况的查询与分析
开发数据分析与处理的SQL脚本
本节操作介绍提交SQL脚本分析数据的操作步骤。
- 在DataArts Studio数据开发页面,选择左侧导航栏的“数据开发 > 脚本开发”。
- 单击“新建DLI SQL脚本”。
图14 新建DLI SQL脚本
- 在脚本编辑页面输入分析数据的示例代码。
1 2
-- 查询单日销售情况 SELECT transaction_id, productid, productname, quantity, dt FROM supermarket_db.analyze WHERE dt = '2024-11-01';
- 单击“保存”,保存SQL脚本,本例定义脚本名称为 select_analyze_data。
- 单击“提交”执行脚本。
步骤4:作业编排
- 在作业 “job_process_data”中新建一个DLI SQL节点 "select_analyze_data"。并单击节点编辑属性。
- SQL或脚本:本例选择“SQL脚本”。并选择1中创建的脚本。
- 数据库名称:选择SQL脚本中设置的数据库。
- 队列名称:选择步骤▪创建弹性资源池并添加SQL队列中创建的SQL队列。
更多属性参数配置请参考DLI SQL属性参数说明。
图15 编辑DLI SQL节点属性 - 属性编辑完成后,单击“保存”,保存属性配置信息。
- 将这两个节点编排成一个pipeline。DataArt会按照编排好的pipeline顺序执行各个节点。然后单击左上角 “保存” 和 “提交”。
步骤5:测试作业运行
作业编排完成后,单击“测试运行”,测试运行作业。
运行结束后,可打开“select_analyze_data”SQL脚本,单击“运行”,查询分析销售明细。
如果查询结果符合预期,可以继续执行步骤6:设置作业周期调度设置作业周期调度。

步骤6:设置作业周期调度
- 在DataArts Studio数据开发页面,选择左侧导航栏的“数据开发 > 作业开发”。
- 双击“job_process_data”。
- 单击右侧导航栏中的 “调度配置”。
- 选择周期调度,并设置调度属性。
本例中,该作业的调度策略从2024/11/22 10:15:00开始生效,且首次执行调度的时间是2024/11/22 10:20:00,调度周期间隔1天,即后续每天10:20:00 AM会自动调度这些这个作业,会按照编排好的pipeline顺序执行作业中的每个节点。
图17 配置作业调度 - 依次单击 “保存” 、“提交” 和 “执行调度” 按钮,即可完成作业周期调度配置。
了解更多作业调度设置请参考调度作业。
相关操作
- 设置作业监控
DataArts Studio提供了对批处理作业的状态进行监控的能力。
批作业是由一个或多个节点组成的流水线,以流水线作为一个整体被调度。
您可以在 DataArts 左侧导航栏 “作业监控 > 批作业监控” 页面查看批处理作业的调度状态、调度周期、调度开始时间等信息。
了解更多DataArts运维调度作业监控。
图18 设置作业监控 - 设置实例监控
作业每次运行,都会对应产生一次作业实例记录。
在数据开发模块控制台的左侧导航栏,选择 “运维调度”,进入实例监控列表页面,您可以在该页面中查看作业的实例信息,并根据需要对实例进行更多操作。
了解更多实例监控。
常见问题
- 如果 DataArts 作业失败,且 DataArts 提供的日志不够详细,怎么办?还能从哪里找更具体的日志?
您可以可通过 DataArts 的日志找到DLI job id,然后根据DLI job id 在DLI控制台中找到具体的作业。图19 监控日志
在DLI控制台中找到具体的作业,单击归档日志即可查看详细日志:
图20 输入作业ID可以通过DataArts的nodename或jobname在DLI 控制台搜索作业:
图21 nodename或jobname - 如果在运行复杂DLI作业时遇到权限类报错,应该怎么办?
使用DLI的过程中需要与其他云服务协同工作,因此需要您将部分服务的操作权限委托给DLI服务,确保DLI具备基本使用的权限,让DLI服务以您的身份使用其他云服务,代替您进行一些资源运维工作。
了解更多:配置DLI云服务委托权限