试图将csv文件加载到bigquery表中。有些列的类型为INTEGER,但有些缺失值为NULL。因此,当我使用命令bq load加载时,出现以下错误:
无法将“null”解析为字段
的int
所以我想知道处理这个问题的最佳解决方案是什么,必须先重新处理数据才能加载bq?
答案 0 :(得分:3)
您需要转换数据才能最终得到预期的架构和数据。而不是INTEGER,将列指定为STRING类型。将CSV文件加载到您不打算长期使用的表格中,例如YourTempTable。在BigQuery UI中,单击“显示选项”,然后选择包含所需表名的目标表。现在运行查询:
#standardSQL
SELECT * REPLACE(SAFE_CAST(x AS INT64) AS x)
FROM YourTempTable;
这会将字符串值转换为'null'
被视为null
的整数。
答案 1 :(得分:1)
请尝试使用作业配置设置。
job_config.null_marker =' NULL'
configuration.load.nullMarker
串
[可选]指定表示CSV文件中的空值的字符串。例如,如果指定" \ N",BigQuery会解释" \ N"加载CSV文件时为空值。默认值为空字符串。 如果将此属性设置为自定义值,如果除STRING和BYTE之外的所有数据类型都存在空字符串,则BigQuery会引发错误。对于STRING和BYTE列,BigQuery将空字符串解释为空值。
https://cloud.google.com/bigquery/docs/reference/rest/v2/jobs#configuration.load
答案 2 :(得分:1)
BigQuery Console有其局限性,不允许您在从CSV加载数据时指定空标记。但是,可以使用BigQuery命令行工具的bq load
命令轻松完成此操作。我们可以使用--null_marker
标志来指定标记,在这种情况下,标记就是null
。
bq load --source_format=CSV \
--null_marker=null \
--skip_leading_rows=1 \
dataset.table_name \
./data.csv \
./schema.json
将null_marker设置为null可以解决此问题。如果表已经存在有效的模式,则可以省略 schema.json 部分。之所以使用--skip_leading_rows=1
是因为我的第一行是标题。
您可以在BigQuery文档中进一步了解bg load command。
但是,load命令使您可以一次创建和加载表。需要在JSON文件中以以下格式指定模式:
[
{
"description": "[DESCRIPTION]",
"name": "[NAME]",
"type": "[TYPE]",
"mode": "[MODE]"
},
{
"description": "[DESCRIPTION]",
"name": "[NAME]",
"type": "[TYPE]",
"mode": "[MODE]"
}
]