本指南是关于在 Apache Spark 中编写标准化且可操作的错误消息的参考。
Spark 中抛出的异常应回答五个 W 和一个 How
异常提供的上下文可以帮助回答谁(通常是用户)、何时(通常通过log4j
包含在日志中)和何地(通常包含在堆栈跟踪中)。然而,仅凭这些答案通常不足以让用户解决问题。一个回答剩余问题——是什么、为什么和如何——的错误消息能最大程度地减少用户沮丧感。
在许多情况下,错误消息应明确回答是什么、为什么和如何。
无法为内部类 {} 生成编码器,因为它无法访问定义此类的作用域。请尝试将此类移出其父类。
如果建议的修复方法(如何)感觉随意,提供关于错误发生原因的解释可以减少用户沮丧感。
之前
之后
函数名 {} 无效。临时函数不能属于目录。请指定一个包含一个或两个部分的函数名。
并非所有错误消息都应如此冗长。有时,明确解释如何解决问题是多余的;在这种情况下,您可以跳过明确的解释。
之前
之后
不能为窗口表达式 {} 指定框架。 窗口表达式中的函数框架 {} 与规范框架 {} 不匹配。
之前
之后
无效小数 {}; 在位置 {} 解析时遇到错误。
有时,即使明确解释问题发生原因也是多余的;在这种情况下,您可以跳过明确的解释。
短语 | 何时使用 | 示例 |
---|---|---|
Unsupported (不支持的) | 用户可能合理地认为该操作是受支持的,但实际上并非如此。如果开发者将来添加对该操作的支持,此错误可能会消失。 |
数据类型 {} 不支持。
|
Invalid / Not allowed / Unexpected (无效的 / 不允许的 / 意外的) | 用户在指定操作时犯了错误。消息应告知用户如何解决错误。 |
数组大小为 {},索引 {} 无效。
|
为子句 {} 找到 {} 个生成器。只允许一个生成器。
|
||
找到一个意外的状态格式版本 {}。预期版本为 1 或 2。
|
||
Failed to (未能) | 系统遇到意外错误,不能合理归因于用户错误。 |
未能编译 {}。
|
Cannot (不能) | 任何时候,最好只在以上替代方案不适用时使用。 |
不能为不支持的类型 {} 生成代码。
|
最佳实践 | 之前 | 之后 |
---|---|---|
使用主动语态 |
数据类型 {} 不被 {} 支持。
|
{} 不支持数据类型 {}。
|
避免基于时间的陈述,例如未来支持的承诺 |
Pandas UDF 聚合表达式目前在枢轴中不支持。
|
枢轴不支持Pandas UDF 聚合表达式。
|
Parquet 类型尚不支持:{}。
|
{} 不支持Parquet 类型。
|
|
使用现在时描述错误并提供建议 |
无法在 {} 找到 {} 的引用列。
|
不能在 {} 找到 {} 的引用列。
|
连接策略提示参数应该是标识符或字符串,但却是 {}。
|
不能使用连接策略提示参数 {}。请使用表名或标识符指定参数。
|
|
如果解决方案不明确,请提供具体示例 |
{} 提示期望分区号作为参数。
|
{} 提示期望分区号作为参数。例如,使用 {}(3) 指定 3 个分区。
|
避免听起来有指责性、评判性或侮辱性 |
你必须为 {} 指定一个数量。
|
{} 不能为空。请为 {} 指定一个数量。
|
直接明了 |
Spark 数据源 V2 中不允许使用 LEGACY 存储分配策略。请将配置 spark.sql.storeAssignmentPolicy 设置为其他值。
|
Spark 数据源 V2 不允许 LEGACY 存储分配策略。请将配置 spark.sql.storeAssignment 设置为 ANSI 或 STRICT。
|
在面向用户的错误中不要使用编程术语 |
RENAME TABLE 源和目标数据库不匹配:'{}' != '{}'。
|
RENAME TABLE 源和目标数据库不匹配。源数据库是 {},但目标数据库是 {}。
|