我为外部表的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
任何人都可以帮助我,可能的解决方法是什么?
答案 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值来正确表示。