Google cloud platform 将无效的JSON列存储为字符串或在BigQuery中跳过它们

Google cloud platform 将无效的JSON列存储为字符串或在BigQuery中跳过它们,google-cloud-platform,google-bigquery,ndjson,Google Cloud Platform,Google Bigquery,Ndjson,我有一个JSON数据文件,如下所示 { "key_a": "value_a", "key_b": "value_b", "key_c": { "c_nested/invalid.key.according.to.bigquery": "valid_value_though" } } 正如我们所知,BigQuery将c_嵌套/无效的.key.preduce.to.BigQuery视为无效的列名。我有大量由StackDriver导出到Google云存

我有一个JSON数据文件,如下所示

{
    "key_a": "value_a",
    "key_b": "value_b",
    "key_c": {
        "c_nested/invalid.key.according.to.bigquery": "valid_value_though"
    }
}
正如我们所知,BigQuery将c_嵌套/无效的.key.preduce.to.BigQuery视为无效的列名。我有大量由StackDriver导出到Google云存储的日志数据,其中有许多无效字段(根据BigQuery
的规定,字段必须只包含字母、数字和下划线,以字母或下划线开头,长度最多为128个字符)。

作为一种解决方法,我尝试将值作为字符串存储到bigquery表中的
键c
(整个
{“c\u嵌套/invalid.key.from.by.bigquery:“valid\u value\u though”}
对象)

我假设我的表定义如下所示:

[
    {
        "mode": "NULLABLE", 
        "name": "key_a", 
        "type": "STRING"
    },
    {
        "mode": "NULLABLE", 
        "name": "key_b", 
        "type": "STRING"
    },
    {
        "mode": "NULLABLE", 
        "name": "key_c", 
        "type": "STRING"
    }
]
当我尝试使用此架构创建表时,出现以下错误:

Error while reading data, error message: JSON table encountered too many errors, giving up. Rows: 1; errors: 1. Please look into the errors[] collection for more details.

Error while reading data, error message: JSON processing encountered too many errors, giving up. Rows: 1; errors: 1; max bad: 0; error percent: 0

Error while reading data, error message: JSON parsing error in row starting at position 0: Expected key
假设BigQuery现在支持它,我想用下面的模式跳过
key\u c
列:

[
    {
        "mode": "NULLABLE", 
        "name": "key_a", 
        "type": "STRING"
    },
    {
        "mode": "NULLABLE", 
        "name": "key_b", 
        "type": "STRING"
    }
]
上面的模式允许我至少创建一个永久表(用于查询外部数据),但当我尝试查询数据时,会出现以下错误:

Error while reading table: 
projectname.dataset_name.table_name, error message: 
JSON parsing error in row starting at position 0: No such field: key_c.
我知道有一种方法可以将每个JSON行原始加载到BigQuery(就像它是CSV一样),然后在BigQuery中解析,但这会使查询变得太复杂

清理数据是唯一的方法吗?我如何处理这个问题


我正在寻找一种方法,可以跳过为无效字段创建列,然后直接存储为字符串,或者干脆完全忽略它们。这可能吗?

人们使用BQ(和其他云数据库)的一个主要前提是存储便宜。在实践中,将“原始”或“源”数据加载到BQ中,然后根据需要对其进行转换(视图或其他转换工具)通常是有帮助的。这是从
ETL
ELT
的范式转变

考虑到这一点,我将把您的“无效”JSON blob作为字符串导入,然后在转换步骤中解析它。这里有一种方法:

 with data as (select '{"key_a":"value_a","key_b":"value_b","key_c":{"c_nested/invalid.key.according.to.bigquery":"valid_value_though"}}' as my_string)
select 
  JSON_EXTRACT_SCALAR(my_string,'$.key_a') as key_a,
  JSON_EXTRACT_SCALAR(my_string,'$.key_b') as key_b,
  JSON_EXTRACT_SCALAR(REPLACE(my_string,"c_nested/invalid.key.according.to.bigquery","custom_key"),'$.key_c.custom_key') as key_c
from data

per OP—“我正在寻找一种方法,可以跳过为无效字段创建列,然后直接存储为字符串,或者干脆完全忽略它们”!以防万一,如果您错过了这一部分,这将解释如何将数据查询到Bigquery中。考虑到这些无效字段,您介意解释一下如何将数据放入Bigquery吗?我不希望将数据加载到stackdriver中,而是创建一个外部表,将数据保存到Google云存储中,但在Bigquery中查询它。gcp如何解释这个过程。完全理解。要回答您的特定问题:
这可能吗?
,那么答案是“可能”。我是一名行业分析师,所以我通常会尝试“完成工作”,所以我更喜欢选择简单、经过测试的解决方案(也从米克海尔的答案中学到了很多东西)。如果你把这个问题看作是数据工程/管道/谷歌云的问题,那么我的建议在这种情况下可能不是最优的,也很公平。这个问题有一个BigQuery标签,我提供了一个BigQuery解决方案。@MikhailBerlyant您能告诉我我在问题中试图解释的内容是否可行(或者是处理这种情况的最佳方法)?