【问题标题】:Google Cloud Functions: loading GCS JSON files into BigQuery with non-standard keysGoogle Cloud Functions:使用非标准键将 GCS JSON 文件加载到 BigQuery
【发布时间】:2018-06-21 13:44:07
【问题描述】:

我有一个 Google Cloud Storage 存储桶,其中的旧系统会丢弃需要加载到 BigQuery 中的 NEW_LINE_DELIMITED_JSON 文件。

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

{
  "id": 12345,
  "@address": "XXXXXX"
  ...
}

当然,“@address”键会抛出所有问题,并且云功能会出错......

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

我正在考虑以下选项:

  • 将内存中的文件加载到字符串var中
  • 用地址替换@address
  • 将 json 换行符转换为字典列表
  • 使用 bigquery 流插入在 BQ 中插入行

但是恐怕这会花费更长的时间,文件大小可能会超过函数的最大 2Gb,在变量中加载文件时处理 unicode 等等等等等等。

我还有什么其他选择?

不,我不能修改旧系统来重命名“@address”字段:(

谢谢!

【问题讨论】:

  • 您遇到的具体错误是什么?与其直接从 Cloud Function 启动加载作业,不如让 Cloud Functions 启动 Dataflow 管道(模板)并让它执行加载。
  • 嘿@GrahamPolley 抱歉,是的,错误是您在答案中提到的错误。让我读一下答案,我会尽快回复您 - 谢谢!

标签: json google-bigquery google-cloud-storage google-cloud-functions google-api-client


【解决方案1】:

我将假设您遇到的错误是这样的:

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

这是 BigQuery 方面的错误消息,因为 BigQuery 中的列/字段有命名限制。因此,您必须先清理文件,然后再将它们加载到 BigQuery。

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

  1. 创建云函数以在新文件到达存储桶时触发。你已经通过事物的声音完成了这部分。
  2. 创建一个模板化 Cloud Dataflow 管道,在新文件到达时由 Cloud Function 触发。它只是将要处理的文件的名称传递给管道。
  3. 在上述 Cloud Dataflow 管道中,将 JSON 文件读入 ParDo,并使用 JSON 解析库(例如,如果您使用 Java,则为 Jackson),在创建输出之前读取对象并删除“@” TableRow 对象。
  4. 将结果写入 BigQuery。实际上,这将调用 BigQuery 加载作业。

总而言之,conga 行中需要以下内容:

File > GCS > Cloud Function > Dataflow (template) > BigQuery

这样做的好处:

  1. 事件驱动
  2. 可扩展
  3. 无服务器/无操作
  4. 您可以使用 Stackdriver 立即获得监控警报
  5. 最小代码

见:

披露:最后一个链接是我合作的一位工程师撰写的博客。

【讨论】:

  • 感谢 Graham - 我正在按照建议构建管道,尽管我正在用 Python 编写数据流并且模板化作业存在问题:stackoverflow.com/q/48308693/399302 你碰巧知道 DF for Python 吗?
猜你喜欢
  • 1970-01-01
  • 2018-04-22
  • 1970-01-01
  • 2023-01-27
  • 1970-01-01
  • 1970-01-01
  • 2019-03-25
  • 1970-01-01
  • 2019-07-11
相关资源
最近更新 更多