3

我遇到了一个问题,我使用 Dataflow 解析文本文件,然后将相关数据放入 BQ。该问题似乎是由文本文件中的一行格式错误的输入引起的。我能够修复错误,但它让我思考:如果我有一行输入数据流,有什么办法可以找出这条线?这将使 Dataflow 调试的一部分变得更加容易,特别是如果您的输入文件有几十亿行并且您必须追踪导致问题的一行。

例如,假设我正在向 BigQuery 发布我认为是整数的数据。我可能会像这样创建我的架构:

List<TableFieldSchema> fields = new ArrayList<>();
    fields.add(newTableFieldSchema().setName("ItemNum").setType("INTEGER"));

我可能会使用此函数将输入数据映射到 BigQuery 架构:

    public void processElement(ProcessContext c) {

        TableRow row = new TableRow();
        row.set("ItemNum", c.element()); 
        c.output(row);
    }

但是,当 Dataflow 遇到我的格式错误的输入(不是整数)时,我收到如下错误:

工作流失败。原因:(30d455a6f7aaaaaa):项目“项目名称”中的 BigQuery 作业“dataflow_job_3518531384490999999”完成错误:作业错误:无法将值转换为整数(错误值或超出范围)。,错误:无法转换值到整数(错误值或超出范围)。,错误:无法将值转换为整数(错误值或超出范围)。,错误:无法将值转换为整数(错误值或超出范围)。,错误:无法将值转换为整数(错误值或超出范围)。错误:无法将值转换为整数(错误值或超出范围)。

在这种特殊情况下,我应该在尝试将其放入 BigQuery 之前验证我的输入是否为预期的整数(然后记录任何未通过验证的数据)。但是一般问题仍然存在——假设我想查看导致此错误的输入,因为(我认为)我已经执行了所有适当的输入验证,并且不知道哪种格式错误的数据可能会导致此错误。我该怎么做?我在想某种 try/catch 类型的技巧(可能涉及日志消息)可能会起作用,但我不确定如何做到这一点。

谢谢!

4

1 回答 1

1

您建议的方法(使用 try/catch,分别记录您的解析错误)是目前的好方法。我们正在积极研究使管道编写者能够处理此类问题的选项。

于 2015-03-06T21:22:08.907 回答