Google云功能:使用非标准键将GCS JSON文件加载到BigQuery中

Google云功能:使用非标准键将GCS JSON文件加载到BigQuery中,json,google-bigquery,google-cloud-storage,google-cloud-functions,google-api-client,Json,Google Bigquery,Google Cloud Storage,Google Cloud Functions,Google Api Client,我有一个Google云存储桶,其中一个遗留系统会丢弃需要加载到BigQuery中的新行分隔的JSON文件 我编写了一个GoogleCloud函数,它获取JSON文件并将其加载到BigQuery。该函数适用于示例JSON文件-问题是遗留系统正在使用非标准密钥生成JSON: { "id": 12345, "@address": "XXXXXX" ... } 当然“@address”键会抛出所有内容,云函数也会出错 是否有任何选项可以“忽略”具有非标准键的JSON字段?或者提供映射并忽略

我有一个Google云存储桶,其中一个遗留系统会丢弃需要加载到BigQuery中的新行分隔的JSON文件

我编写了一个GoogleCloud函数,它获取JSON文件并将其加载到BigQuery。该函数适用于示例JSON文件-问题是遗留系统正在使用非标准密钥生成JSON:

{
  "id": 12345,
  "@address": "XXXXXX"
  ...
}
当然“@address”键会抛出所有内容,云函数也会出错

是否有任何选项可以“忽略”具有非标准键的JSON字段?或者提供映射并忽略映射中不存在的任何JSON字段?我环顾四周,看看是否可以停用autodetect并提供我自己的映射,但在线文档没有涵盖这种情况

我正在考虑以下选择:

  • 将内存中的文件加载到字符串变量中
  • 将@address替换为address
  • 将分隔的json新行转换为字典列表
  • 使用bigquery stream insert在BQ中插入行
但我担心这将花费更长的时间,文件大小可能超过函数的最大2Gb,在变量中加载文件时处理unicode,等等

我还有其他选择吗

不,我无法修改旧系统以重命名“@address”字段:(


谢谢!

我假设您得到的错误如下:

错误:查询:无效的字段名“@address”。字段必须包含 只有字母、数字和下划线以字母或字母开头 下划线,最大长度为128个字符

这是BigQuery端的一条错误消息,因为BigQuery中的cols/字段有命名限制。因此,您必须在将文件加载到BigQuery之前清理这些文件

下面是一种完全无服务器的方法:

  • 创建一个云函数,在新文件到达bucket时触发。您已经完成了这一部分
  • 创建一个模板化的云数据流管道,当新文件到达时,该管道由云函数触发。它只是将要处理的文件的名称传递给管道
  • 在所述云数据流管道中,将JSON文件读入
    ParDo
    ,并使用JSON解析库(例如,如果使用Java,则使用Jackson),读取对象并在创建输出
    TableRow
    对象之前去掉“@”
  • 将结果写入BigQuery。实际上,这将调用BigQuery加载作业
  • 总而言之,conga行中需要以下内容:

    File > GCS > Cloud Function > Dataflow (template) > BigQuery
    
    这样做的好处是:

  • 事件驱动
  • 可伸缩
  • 无服务器/无操作
  • 您可以使用Stackdriver获得即时监控警报
  • 最小码
  • 见:


    披露:最后一个链接是我的一位同事写的博客。

    你到底遇到了什么错误?与其直接从云函数启动加载作业,不如让云函数启动数据流管道(模板)作为谨慎的做法让它加载。嘿@GrahamPolley抱歉,是的,错误就是你在回答中提到的错误。让我读一下答案,然后再给你回复-谢谢!谢谢Graham-我正在按照建议构建管道,尽管我正在用Python编写数据流,并且模板化作业有问题:你知道Python的DF吗?