For Each算子使用介绍 {Loop.dataArray} :For循环算子输入的数据集,是一个二维数组。 {Loop.current}:由于For循环算子在处理数据集的时候,是一行一行进行处理的,那Loop.current就表示当前处理到的某行数据,Loop.current是一个一维数组,一般定义格式为 {Loop.current[0]}、 {Loop.current[1]}或其它,0表示遍历到当前行的第一个值。 {Loop.offset}:For循环算子在处理数据集时当前的偏移量,从0开始。 {Job.getNodeOutput('preNodeName')}:获取前面节点的输出。 使用案例 案例场景 因数据规整要求,需要周期性地将多组DLI源数据表数据导入到对应的DLI目的表,如下表所示。 需要导入的列表情况 源数据表名 目的表名 anew a b2 b c3 c d1 d c5 e b1 f 如果通过SQL节点分别执行导入脚本,需要开发大量脚本和节点,导致重复性工作。在这种情况下,我们可以使用For Each算子进行循环作业,节省开发工作量。 配置方法 1. 准备源表和目的表。为了便于后续作业运行验证,需要先创建DLI源数据表和目的表,并给源数据表插入数据。 创建DLI表。您可以在DataArts Studio数据开发中,新建DLI SQL脚本执行以下SQL命令,也可以在数据湖探索(DLI)服务控制台中的SQL编辑器中执行以下SQL命令: / 创建数据表 / CREATE TABLE anew (name STRING, score INT) STORED AS PARQUET; CREATE TABLE b2 (name STRING, score INT) STORED AS PARQUET; CREATE TABLE c3 (name STRING, score INT) STORED AS PARQUET; CREATE TABLE d1 (name STRING, score INT) STORED AS PARQUET; CREATE TABLE c5 (name STRING, score INT) STORED AS PARQUET; CREATE TABLE b1 (name STRING, score INT) STORED AS PARQUET; CREATE TABLE a (name STRING, score INT) STORED AS PARQUET; CREATE TABLE b (name STRING, score INT) STORED AS PARQUET; CREATE TABLE c (name STRING, score INT) STORED AS PARQUET; CREATE TABLE d (name STRING, score INT) STORED AS PARQUET; CREATE TABLE e (name STRING, score INT) STORED AS PARQUET; CREATE TABLE f (name STRING, score INT) STORED AS PARQUET; 给源数据表插入数据。您可以在DataArts Studio数据开发模块中,新建DLI SQL脚本执行以下SQL命令,也可以在数据湖探索(DLI)服务控制台中的SQL编辑器中执行以下SQL命令: / 源数据表插入数据 / INSERT INTO anew VALUES ('ZHAO','90'),('QIAN','88'),('SUN','93'); INSERT INTO b2 VALUES ('LI','94'),('ZHOU','85'); INSERT INTO c3 VALUES ('WU','79'); INSERT INTO d1 VALUES ('ZHENG','87'),('WANG','97'); INSERT INTO c5 VALUES ('FENG','83'); INSERT INTO b1 VALUES ('CEHN','99'); 2. 准备数据集数据。您可以通过以下方式之一获取数据集: 您可以将上表数据导入到DLI表中,然后将SQL脚本读取的结果作为数据集。 您可以将上表数据保存在OBS的CSV文件中,然后通过DLI SQL或DWS SQL创建OBS外表关联这个CSV文件,然后将OBS外表查询的结果作为数据集。DLI创建外表请参见,DWS创建外表请参见。 您可以将上表数据保存在HDFS的CSV文件中,然后通过HIVE SQL创建Hive外表关联这个CSV文件,然后将HIVE外表查询的结果作为数据集。DLI创建外表请参见。 本例以方式1进行说明,将上表中的数据导入到DLI表(TableList)中。您可以在DataArts Studio数据开发模块中,新建DLI SQL脚本执行以下SQL命令导入数据,也可以在数据湖探索(DLI)服务控制台中的SQL编辑器中执行以下SQL命令: / 创建数据表TABLELIST,然后插入表1数据,最后查看生成的表数据 / CREATE TABLE TableList (Source STRING, Destination STRING) STORED AS PARQUET; INSERT INTO TableList VALUES ('anew','a'),('b2','b'),('c3','c'),('d1','d'),('c5','e'),('b1','f'); SELECT FROM TableList; 生成的TableList表数据如下: 详见下图:TableList表数据 3. 创建要循环运行的子作业ForeachDemo。在本次操作中,定义循环执行的是一个包含了DLI SQL节点的任务。 进入DataArts Studio数据开发模块选择“作业开发”页面,新建作业ForeachDemo,然后选择DLI SQL节点,编排下图所示的作业。 DLI SQL的语句中把要替换的变量配成{}这种参数的形式。在下面的SQL语句中,所做的操作是把{Source}表中的数据全部导入{Destination}中,{fromTable}、${toTable} 就是要替换的变量参数。SQL语句为: INSERT INTO {Destination} select from {Source}; 说明 此处不能使用EL表达式