BQ无法在外部联合表的表定义中使用nullMarker:“ \ N”将“ \ N”解析为INT或DATETIME

时间:2019-01-31 20:37:51

标签: google-bigquery google-cloud-storage external-tables federated-table

我为外部表的JSON表定义中的INTEGER或DATETIME数据类型使用“ \ N”表示null(nullMarker:“ \ N”),但是BQ无法解析它并抛出以下错误:

error message: Could not parse '\N' as int for field [Field Name](position 2) 
starting at location 0

任何人都可以帮助我,可能的解决方法是什么?

1 个答案:

答案 0 :(得分:0)

我正在使用BigQuery Cloud SDK CLI尝试执行相同操作。我正在使用标志--null_marker="\N"--source_format NEWLINE_DELIMITED_JSON来加载数据。这是我收到的错误消息:

BigQuery error in load operation: Only CSV imports may specify a null marker.

因此,看来JSON格式的BigQuery导入不支持空标记。对我来说非常令人失望。

这是我用来测试和验证的确切代码和示例:

这是一个名为example.json的文件,我希望其中的\N字符代表NULL标记。

    {"col1": "1", "col2": "A Fat Man", "col3": "3.5", "col4": "SOme moRE TExt"}
    {"col1": "2", "col2": "\N", "col3": "4.2", "col4": "texttexttext"}
    {"col1": "3", "col2": "\N", "col3": "\N", "col4": "JUSTTEXT"}
    {"col1": "4", "col2": "uno", "col3": "2.0", "col4": ""}

这是制作表格的命令(我的数据集是temp14):

    bq mk temp14.null_json_test col1:INTEGER,col2:STRING,col3:FLOAT,col4:STRING

这是加载无效数据的命令:(

    bq load --source_format NEWLINE_DELIMITED_JSON --null_marker="\N" temp14.null_json_test ./example.json col1:INTEGER,col2:STRING,col3:FLOAT,col4:STRING

我可以将JSON中的\N替换为空字符串,例如

    {"col1": "1", "col2": "A Fat Man", "col3": "3.5", "col4": "SOme moRE TExt"}
    {"col1": "2", "col2": "", "col3": "4.2", "col4": "texttexttext"}
    {"col1": "3", "col2": "", "col3": "", "col4": "JUSTTEXT"}
    {"col1": "4", "col2": "uno", "col3": "2.0", "col4": ""}

,如果我删除该标志,它将加载:

    bq load --source_format NEWLINE_DELIMITED_JSON temp14.null_json_test ./example.json col1:INTEGER,col2:STRING,col3:FLOAT,col4:STRING

但是字符串以“”而不是null的形式加载到表中,我需要将它们设置为NULL。 FLOAT字段正确分配了NULL,但STRING却没有。

我的解决方法是在临时区域中对数据集中的空字符串进行预处理,这就像一个临时空间,然后让我的最终表使用以下内容表示该数据:

    SELECT 
      col1
      , CASE WHEN col2 = '' THEN NULL ELSE col2 END as col2
      , col3
      , CASE WHEN col4 = '' THEN NULL ELSE col4 END as col4
    FROM
      temp14.null_json_test

我不能悲伤地将CSV用于数据,需要JSON才能工作,但也需要NULL值来正确表示。