Apache Hop Python脚本转换输出metrics字段为NULL如何解决
问题解决方法
核心原因
你的Python脚本最后生成了metrics JSON字符串,但没有将这个值赋值到Hop的行(row)对象中,后续的写入步骤无法读取到该字段,所以写入表时显示为NULL。
具体修复步骤
在脚本末尾添加行赋值代码
在metrics = json.dumps(metrics)之后,添加一行代码,将JSON字符串写入Hop行的指定字段(比如你要写入表的metrics字段):# 假设目标字段名为metrics,将值写入row对象 row.setValue("metrics", metrics)如果你的目标字段名不是
metrics,替换成实际的字段名称即可。确保Python脚本转换的输出字段配置正确
打开Python脚本转换的配置界面,切换到字段标签页,确认已经添加了要输出的metrics字段(或你指定的字段名),字段类型设置为String(因为JSON是字符串格式);如果没有添加,点击添加按钮填写字段名和类型后保存配置。可选:处理无匹配的边界情况
如果matches为空(即没有匹配到任何指标数据),当前代码生成的metrics只有hop_job键,可能不符合预期。可以添加判断避免空指标的情况:# 在循环结束后添加 if ingest_nr not in metrics: metrics[ingest_nr] = 0 metrics[written_nr] = 0 metrics[error_nr] = 0
修复后的完整代码
import re import json metrics_regex = r'\d\d\d\d/\d\d/\d\d\s\d\d:\d\d:\d\d\s-\s.*\s-\sFinished processing\s\(I=(\d+),\s\w=\d+,\s\w=\d+,\s\w=(\d+),\s\w=\d+,\s\w=(\d+)\)' matches = re.findall(metrics_regex, rowMeta.getString(row, 6)) ingest_nr = 'total_records_ingested' written_nr = 'total_records_written' error_nr = 'total_errored_records' metrics = {'hop_job': rowMeta.getString(row, 1)} for match in matches: r_in, r_out, r_err = int(match[0]), int(match[1]), int(match[2]) if len(metrics.keys()) == 1: metrics[ingest_nr] = r_in metrics[written_nr] = r_out metrics[error_nr] = r_err else: metrics[ingest_nr] += r_in metrics[written_nr] += r_out metrics[error_nr] += r_err # 处理无匹配的情况,避免缺失指标字段 if ingest_nr not in metrics: metrics[ingest_nr] = 0 metrics[written_nr] = 0 metrics[error_nr] = 0 metrics = json.dumps(metrics) # 将结果赋值到row对象的metrics字段,供后续步骤读取 row.setValue("metrics", metrics)
内容的提问来源于stack exchange,提问作者it2901
相关产品推荐
相关产品推荐

