Google bigquery 在从数据流插入BigQuery之前验证行

Google bigquery 在从数据流插入BigQuery之前验证行,google-bigquery,google-cloud-dataflow,Google Bigquery,Google Cloud Dataflow,据 当前无法在从数据流将数据加载到BigQuery时设置maxBadRecords配置。建议在将数据流作业中的行插入BigQuery之前对其进行验证 如果我有TableSchema和TableRow,如何确保该行可以安全地插入到表中 要做到这一点,必须有一种比遍历模式中的字段、查看字段的类型和行中值的类更简单的方法,对吗?这似乎很容易出错,而且该方法必须是傻瓜式的,因为如果无法加载一行,整个管道都会失败 更新: 我的用例是一个ETL作业,它首先将在云存储上的JSON(每行一个对象)日志上运行并批

据 当前无法在从数据流将数据加载到BigQuery时设置
maxBadRecords
配置。建议在将数据流作业中的行插入BigQuery之前对其进行验证

如果我有
TableSchema
TableRow
,如何确保该行可以安全地插入到表中

要做到这一点,必须有一种比遍历模式中的字段、查看字段的类型和行中值的类更简单的方法,对吗?这似乎很容易出错,而且该方法必须是傻瓜式的,因为如果无法加载一行,整个管道都会失败

更新:

我的用例是一个ETL作业,它首先将在云存储上的JSON(每行一个对象)日志上运行并批量写入BigQuery,但稍后将从PubSub读取对象并连续写入BigQuery。这些对象包含很多BigQuery中不需要的信息,还包含一些甚至无法在模式中描述的部分(基本上是自由格式的JSON有效负载)。时间戳之类的东西也需要格式化才能使用BigQuery。此作业将有一些变体在不同的输入上运行并写入不同的表

理论上,这不是一个非常困难的过程,它获取一个对象,提取一些属性(50-100),格式化其中一些属性,并将对象输出到BigQuery。我或多或少只是在属性名列表上循环,从源对象提取值,查看配置以查看属性是否应该以某种方式进行格式化,如果需要,应用格式化(这可能是降格,将毫秒时间戳除以1000,从URL提取主机名,等等),并将该值写入
TableRow
对象

我的问题是数据很混乱。有两亿个物体,有些看起来不像预期的,这是很罕见的,但在这些体积下,罕见的事情仍然会发生。有时,应包含字符串的属性包含整数,反之亦然。有时数组或对象中应该有字符串

理想情况下,我想拿着我的
表格行
,把它传递给
表格模式
,然后问“这有用吗?”

因为这是不可能的,所以我要做的是查看
TableSchema
对象并尝试自己验证/转换这些值。如果
TableSchema
表示某个属性的类型为
STRING
,则在将其添加到
TableRow
之前,我会运行
value.toString()
。如果它是一个
整数
,我会检查它是否是
整数
大整数
,依此类推。这个方法的问题是,我只是在猜测什么在BigQuery中起作用。对于
FLOAT
,它将接受哪些Java数据类型?对于
时间戳
?我认为我的验证/强制转换捕获了大多数问题,但总是存在异常和边缘情况

根据我的经验,这是非常有限的,如果一行未通过BigQuery的验证,整个工作管道(作业?工作流?不确定正确的术语)将失败(就像常规加载一样,除非
maxBadRecords
设置为足够大的数字)。它也会失败,出现表面上有用的消息,如“BigQuery导入作业”dataflow\u job\u xxx“失败”。原因:(5db0b2cdab1557e0):项目“xxx”中的BigQuery作业“dataflow_job_xxx”已完成,但出现错误:errorResult:为非记录字段指定JSON映射,error:为非记录字段指定JSON映射,error:为非记录字段指定JSON映射,错误:为非记录字段“”指定了JSON映射。也许在某个地方可以看到更详细的错误消息,可以告诉我它是哪个属性,值是什么?如果没有这些信息,它还不如说是“坏数据”

据我所知,至少在批处理模式下运行时,Dataflow会将
TableRow
对象写入云存储中的暂存区域,然后在所有内容都存在后启动加载。这意味着我无处捕捉任何错误,加载BigQuery时我的代码不再运行。我还没有在流模式下运行任何作业,但我不确定它会有什么不同,因为我(承认有限)理解基本原理是一样的,只是批量更小


人们使用Dataflow和BigQuery,因此不必总是担心整个管道因为一个错误的输入而停止,就不可能完成这项工作。人们是如何做到这一点的?

我假设您将文件中的JSON反序列化为
映射。然后,您应该能够使用
TableSchema
递归地键入check

我推荐一种迭代方法来开发模式验证,包括以下两个步骤

  • 编写一个
    pttransform
    ,将JSON行转换为
    TableRow
    对象。
    TableSchema
    也应该是函数的构造函数参数。您可以从严格执行此函数开始—例如,当找到BigQuery整数模式时,要求JSON直接将输入解析为整数—并积极声明错误记录。基本上,通过严格的处理确保没有无效记录输出

    我们的工作有点类似——给定一个由BigQuery生成并作为JSON写入GCS的文件,我们递归地遍历模式并进行一些类型转换。但是,我们不需要验证,因为BigQuery本身编写了数据

    请注意,
    TableSchema
    对象不可
    序列化
    。我们通过在
    DoFn
    PTransform
    construct中转换
    TableSchema
    来解决这个问题