2012-09-20 26 views
0

即使接收到的数据少于预期的列数,是否可以插入记录? 我经常收到以下消息。在大查询中跳过一致性检查

Too few columns: expected 24 column(s) but got 22 column(s) 

如果我使用max_bad_record选项忽略这些记录,我会丢失数据。我希望看到一个选项,如果需要,可以通过添加额外的分隔符强制插入记录。

回答

1

正如Michael Sheldon在下面提到的那样,如果您指定了allowJaggedRows,那么列数太少的行将为其余所有列获得NULL。但是,如果在该行中间缺少列,BigQuery不知道缺少哪个列,并且如果这些类型不匹配,则会为该行获取错误。

有一些关于将所有包含错误的行添加到单独的表中的说法,以便您可以处理它们并将它们附加到原始表中。如果你会发现这个有用,让我知道。

+0

请添加--force选项,假设缺少的列在最后。当涉及到数据完整性时,使用此选项的用户将自行处理。 – shantanuo

+1

我建议在数据被摄入BigQuery之前,在提取和转换步骤中处理数据完整性。一般来说,我不认为数据管道的分析层应该负责处理来自管道其他部分的数据一致性问题。 –

+0

如果我需要3列管道分隔文件,我可以使用awk#awk -F'|' 'BEGIN {OFS =“|”} {print $ 1,$ 2,$ 3}'#但我无法自动执行导入流程。我必须解压缩,打开文件,运行awk,zip并继续。 #强制选项真的有帮助,请考虑。 – shantanuo

1

将数据预处理为正确的格式;取决于你的平台,如果你可以使用perl,sed或其他。

也许你可以简单地在所有记录中添加额外的分隔符,如果bigquery不会抱怨太多的字段。

0

是的,您现在可以使用作业加载配置中的allowJaggedRows选项执行此操作。此选项会导致负载“接受缺少结尾可选列的行,缺少的值被视为空值。”有关所有作业配置选项的完整列表,请参阅BigQuery Jobs Reference

在创建和加载新表时,该选项在bq命令行工具中可用:bq load --allow_jagged_rowsBigQuery UI下的“高级选项”。