ETL常见问题
1. 概述
本文将介绍观远BI数据准备模块的智能ETL常见问题。
2. 智能ETL
为什么ETL输出数据集模型结构为空?
问题描述:
可能存在的其他表象:
数据集概览页 “模型结构”和“关联创建”都是空的;
找不到数据集所属ETL,也不能更新数据集。
问题原因:
ETL在创建成功并运行成功之后,所有者在修改ETL的时候,删除了输出数据集节点;然后又重新加了一个输出数据集节点并保存运行。即使新的输出数据集和原来的数据集同名(同名时只能保存在不同文件夹下),也不是同一个数据集。
解决方案:
(1)尽量避免在ETL里删除输出节点。需要在输出节点前增加新的节点的话,点击最后一个节点前的连接线,删除连接线即可,不要删除输出节点。
(2)万一已经删除了输出节点,给新增的输出节点设置保存在同一个文件夹并使用完全相同的名字的话,系统会提示: 同名数据集在此目录已存在, 请重新命名。此时最好不要强制保存ETL,取消保存退出。然后再重新进入编辑界面按照建议1操作。
(3)如果节点已经删除,并且已经做了很多修改不想放弃的话,那只能换个名字或者换个路径保存。然后原来的输出数据集就会和ETL断开联系,模型结构显示为空。此时,需要给依赖于旧数据集的卡片批量切换到新的数据集,然后删除旧数据集。
ETL中SQL节点双引号使用问题
问题原因:
SQL节点查询语句中字段使用了双引号,会被当成字符串处理,去掉双引号或改为反引号即可。
解决方案:
spark语法和MySQL一致,反引号``用来 来避免自行定义的标识符(字段名,表名等)和数据库SQL中的关键字冲突(如FROM,CREATE等关键字)。一般的,表名与字段名都使用反引号,但也可以不加。
ETL什么情况下会出现输入数据集预览无数据?
问题原因:
在ETL中会按照ETL所有者对输入数据集进行行列权限的判断,即使是管理员运行此ETL是按照ETL所有者来判断权限。多数情况下所有者对输入数据集都是有权限的,但是不排除输入数据集之后有行列权限的变动,或者ETL有过转移所有者的操作。
在ETL里用了null值替换,为什么部分null值却没有替换成功?
问题原因1:
字段的值是空字符串,误用了null值替换。
解决方案:
使用「值替换」节点把空字符串换成null。
问题原因2:
替换的目标值和该字段类型不一致,例如把日期类型里的null值替换为0是不生效的。
解决方案:
确保null值替换目标值和字段类型一致。
关于ETL筛选数据行触发条件的解释
1)当过滤规则都选择“等于”的时候:
a. 满足所有规则:即筛选出两个或多个条件都满足的数据,比如选择省份=浙江省,日期=2017-10-05,筛选出满足两个条件的仅有一条的数据。
b. 满足任一规则:即筛选出两个或多个条件中满足其中一个的数据,比如选择省份=浙江省,日期=2017-10-05,筛选出浙江省或者日期为2017-10-05的数据。
2)当过滤规则都选择“不等于”的时候:
a. 满足所有规则:即筛选出两个或多个条件都满足不等于的数据,比如选择省份不等于浙江省,日期不等于2017-10-05,筛选出满足两个条件的数据,结果是省份里不存在浙江省,且日期里不存在2017-10-05。
单独选择省份=浙江省,无数据;
单独选择日期=2017-10-05,无数据;
b. 满足任一规则:即筛选出两个或多个条件中满足其中一个的数据,比如选择省份不等于浙江省,日期不等于2017-10-05,会筛选出不等于浙江省并且日期不等于2017-10-05的数据。单独选择省份=浙江省,有数据;
单独选择日期=2017-10-05,有数据;
选择省份=浙江省且日期=2017-10-05,无数据;
3)总结
a. 当过滤规则为等于时,逻辑比较好理解,满足所有规则就是两个或多个条件都满足,满足任一规则就是满足其中一个条件.
b. 当过滤规则为不等于时,如果想实现的效果是过滤掉满足条件的所有数据,比如此案例是想过滤掉浙江省2018年10月5日的数据,那么触发规则需要选择满足任一规则。
ETL和数据集是否有备份机制
没有单独的备份机制,BI整体数据有备份机制的,每天凌晨2点30会自动备份数据。
BI做数据备份的话,会包含ETL、数据集的内容。
SQL算子能不能使用自定义时间宏?
ETL里面是不支持使用全局参数、动态时间宏的,可以使用相关的动态日期函数如now()、current_date()。
ETL中,新建字段用sum来求和会报错,为什么?
问题原因:
仅仅写个sum的话对于ETL来说其实是它不知道该按照什么维度聚合。卡片中,拖入维度字段,再拖入相应的这个数值字段,他会根据维度字段来自动聚合。
解决方案:
使用分组聚合节点求和,或者新建字段使用窗口函数如sum() over(partition by)。
ETL处理结果的数据集能写回我们的数据库吗?
BI平台5.7及更新版本支持数据回写,此前版本只能通过API对接的方式来实现。有使用数据开发平台产品的,可以实现在universe平台直接写回到指定数据库。
为什么查看不了ETL详情?
问题原因:
普通用户非ETL所有者无法查看ETL详情,只有ETL所有者或者有管理员权限的用户才能查看ETL详情。
重启jobserver和服务器重启对BI任务状态的影响是什么?
服务管理中,重启ETL的jobserver可以kill掉所有正在运行的任务。
服务器上重启BI可以kill掉所有运行中的任务和排队的任务。
ETL支持的输入数据集有?
包括文件数据集、数据库数据集(不含直连数据库、视图数据集)以及其他Smart ETL中的输出数据集。
ETL页面的操作符中,使用合并列操作符后,如何把合并好的字段再拆开?
在合并列的操作符中,可以选择是否删除原始字段,建议保留原始字段,这样既有原始字段也有合并之后的字段可以使用;如果没有保留原始字段,可以使用添加计算字段操作符,使用substr和instr将合并之后的字段进行截取拆分。
在ETL里能否固定随机数?
输出数据集在ETL没有更新的情况下,可以保持随机数不变 ,如果要保留某次结果的话,可以把输出数据集导出来。
想替换某个ETL的输入数据集,通过这个ETL点到这个数据集,进行替换数据,为什么把其他ETL的输入数据集也替换了?
问题原因:
数据集概览这里的替换数据是替换这个数据集本身,并非只是替换某个ETL的输入数据集。
解决方案:
如果只是替换某个ETL的输入数据集,需要点击编辑进去替换。
ETL设置的更新方式为“所有勾选的数据集都更新后才会触发”,但是为什么没等所有数据集都更新,ETL就自动触发更新了?
问题原因:
没有勾选后面的“所有数据集需在同一天内(00:00:00-23:59:59)更新”。这样的话,如果勾选的数据集跨天更新了一轮,也符合触发条件。
解决方案:如果想在同一天数据集更新完成后再运行,请勾选同一天的选项。
SQL节点预览,为什么部分字段类型变化了呢?
SQL节点会从后台重新判断字段类型,不会直接继承前面显示的类型,如果发现类型变化,需要检查前面节点操作是否规范。
问题原因1:
前面有“行拼接”节点,把同名但是类型不同的两个字段拼接到了一起,导致后台无法准确判断类型,会默认显示为字符串string类型。
解决方案:
在“行拼接”前检查问题字段类型,用函数把类型转换一致后再拼接数据集。
问题原因2:
问题字段是前面节点或者上层ETL“添加计算列”生成的,没有规范使用函数,导致字段本身类型和右上角手动选择的类型不一致。这种情况SQL节点纠正后的字段类型可能才是正确的。
解决方案:
检查前面字段生成节点,用函数转换字段类型;或者不做修改,使用SQL输出的字段类型即可。
ETL输出类型与预期不符
问题描述:
SQL节点预览,部分字段类型跟前面节点不一致;或者ETL运行后,部分字段类型和原始类型不一样。
问题原因:
(1)ETL里有“行拼接”节点,把不同数据源里类型不同的同名字段拼接到了一起,如果同名字段中存在 string 类型与其他类型,则展示成 string;
(2)“添加计算列”生成的新字段,没有规范使用函数,导致字段本身类型和右上角手动选择的类型不一致;SQL节点会重新判断字段类型,不会直接继承前面显示的类型,导致部分类型不一致
解决方案:
(1)尽量在“行拼接”前检查问题字段类型,用函数把类型转换一致后再拼接数据集。
(2)“添加计算列”时,用函数转换字段类型,保证数值类型和手动选择的类型一致。
更新License后所有定时任务没有自动运行
问题描述:
旧的License到期之后,更新License,然后所有定时任务(例如数据集、ETL、订阅)都没有自动触发;环境迁移,激活新环境License后,定时任务都失效了。
问题原因:
License到期失效后,BI服务会终止,所有定时任务都会终止,即使重新激活License,定时任务也不会自动触发。BI 5.3.0 以及之后所有版本迁移,在激活新BI环境后,必须重启 guandata-server,否则定时任务失效。
解决方案:
重新激活License后,联系观远服务人员重启整个BI服务即可。
ETL连续更新两次,重复更新
问题描述:
同一个ETL,勾选了全部数据集都更新后才能更新ETL,两个输入数据集都只更新了一次,但是ETL被触发了2次,并且都运行成功了。
问题原因:
两个输入数据集基本是在同一时间更新完成,时间差极小,导致系统2次都判断为符合触发ETL运行的条件,从而运行了2次。
解决方案:
基本不影响使用,可等待观远产品优化;稍微错开输入数据集的更新时间。
数据集更新后,ETL没有进行更新
问题描述:
ETL配置更新方式为“勾选的数据集更新后”, 发现数据集更新了但是ETL没更新。比如设置了「任何一个勾选的数据集更新后都会触发」,勾选了5个数据集,5个数据集一天内都更新了,但是ETL只运行了2次。
问题原因:
观察下输入数据集的更新时间和ETL更新时的排队时间,5个输入数据集更新时间太过接近,任务排队,导致第一次运行还没结束,新的任务已经触发并开始排队,一旦同一个ETL同时出现多个排队任务时,后来的重复的排队任务会被系统自动去重丢弃。
解决方案:
建议使用「所有勾选的数据集都更新后才会触发」;如果对数据时效有要求,需要设置「任何一个勾选的数据集更新后都会触发」,那么需要确保多个输入数据集更新时间错开、不要扎堆(时间间隔要大于ETL运行时长,且留出排队的余地)。