动机
Hive 被广泛应用大数据领域. 它经常用于大型数据集的临时查询和用于实现 ETL 类型的进程. 与即席查询 (Ad Hoc ) 不同, 为 ETL 编写的 Hive SQL 具有一些不同的属性:
通常按计划重复执行.
它通常是一个庞大而复杂的代码体.
更长的寿命, 长期坚持组织的代码库.
经常随着时间的推移对其进行修改
对组织的运作至关重要, 因为它可以生成有价值的数据.
展示此类属性的代码是单元测试覆盖的强有力候选者, 因为它很容易出现错误, 错误和意外破坏, 所有这些都可能对组织构成风险.
挑战
Hive 和 Hive SQL 都存在许多挑战, 这使得构建基于 Hive 的 ETL 系统的单元测试变得困难. 这些可以概括地描述如下:
组件边界不清晰
环境
执行速度
模块化
通过模块化使用 Hive 实现的流程, 它们变得更容易有效地测试并且更容易适应变化. 尽管 Hive 提供了许多用于模块化的向量, 但并不总是清楚如何分解大型过程. 将查询逻辑封装到组件中的功能分为两个垂直问题: 列级逻辑和设置级逻辑. 列级逻辑是指应用于查询中各列或列组的表达式, 通常称为 "函数". 设置级别逻辑涉及操纵数据分组的 Hive SQL 构造, 例如: 列投影与 SELECT , GROUP BY 聚合, JOIN s, ORDER BY 排序等. 在任何一种情况下, 我们都希望单个组件存在于自己的源文件或可部署 artifact 中并导入根据构图的需要. 对于基于 Hive SQL 的组件, SOURCE 命令提供此功能.
列级逻辑的封装
在列级逻辑的情况下, Hive 提供 UDFs 和 macros , 允许用户提取和重用应用于列的表达式. 一旦定义, UDF 和宏可以很容易地隔离进行测试. UDF 可以使用现有的 Java / Python 单元测试工具 (如 JUnit) 进行简单测试, 而宏需要 Hive 命令行界面来执行宏声明, 然后使用一些示例 SELECT 语句来练习它.
设置级逻辑的封装
与列级逻辑不同, 如何最好地封装和组合基于集合的逻辑集合是不太明显的. 请考虑以下包含联接, 分组和列投影的复杂查询示例:
- SELECT ... FROM ( -- Query 1
- SELECT ... FROM ( -- Query 2
- SELECT ... FROM ( -- Query 3
- SELECT ... FROM a WHERE ... -- Query 4
- ) A LEFT JOIN ( -- Query 3
- SELECT ... FROM b -- Query 5
- ) B ON (...) -- Query 3
- ) ab FULL OUTER JOIN ( -- Query 2
- SELECT ... FROM c WHERE ... -- Query 6
- ) C ON (...) -- Query 2
- ) abc LEFT JOIN ( -- Query 1
- SELECT ... FROM d WHERE ... -- Query 7
- ) D ON (...) -- Query 1
- GROUP BY ...; -- Query 1
此查询具有无法单独验证. 它似乎实际上是由至少 7 个不同的查询组成的. 为了有效地对这个过程进行单元测试, 我们必须将每个子查询封装到单独的组件中, 以便可以独立测试它们. 为实现这一目标, 我们可以采取多种方法, 包括:
使用中间表顺序执行组件.
视图
查询片段的变量替换.
SQL 函数 / 过程.
有限的测试表明, VIEW 比使用具有中间表的组件的顺序执行更有效. 中间表解决方案 (包括 TEMPORARY 表) 运行时间更长, 生成更多 I / O, 并限制查询优化机会. VIEW 似乎没有经常预言的性能问题.
变量替换也被建议作为模块化大型查询的方法, 但是在检查时发现它不合适, 因为需要额外的 bash 文件会使测试更复杂. 还可考虑了 HPL/SQL, 但它没有查询模块化所需的必要流水线功能.
参考资料
python 测试开发项目实战 - 目录
python 工具书籍下载 - 持续更新
python 3.7 极速入门教程 - 目录
讨论 qq 群 630011153 144081101
来源: http://www.jianshu.com/p/2c7631ab6cea