【问题标题】:Firebase data to Google BigQueryFirebase 数据到 Google BigQuery
【发布时间】:2016-03-23 18:47:07
【问题描述】:

Firebase 提供private backups on Google Cloud Storage。其中一个特色用例是“引入分析产品”:

Private Backups provides a perfect pipeline into cloud analytics products such as Google’s BigQuery. Cloud Analytics products often prefer to ingest data through Cloud Storage buckets rather than directly from the application.

我在 Firebase 中有大量数据(导出到 Cloud Storage 存储桶时超过 1GB),如 Firebase 产品中所述,我想将这些数据放入 Big Query。

但是真的可以编写适合 Firebase 原始数据的表架构吗? 让我们以 Firebase 文档中的 dinosaur-facts 数据库为例。 JSON 如下所示:

{
  "dinosaurs" : {
    "bruhathkayosaurus" : {
      "appeared" : -70000000,
      "height" : 25
    },
    "lambeosaurus" : {
      "appeared" : -76000000,
      "height" : 2.1
    }
  },
  "scores" : {
    "bruhathkayosaurus" : 55,
    "lambeosaurus" : 21
  }
}

要列出所有恐龙,我想唯一的方法是在 bigQuery 架构中使用 RECORD 字段。但通常 BigQuery 中的 RECORDS 对应于导入的 JSON 中的一个数组。而且Firebase这里没有数组,只是一个以恐龙名字作为键名的对象。

因此,这样的 BigQuery 表架构不起作用:

[
    {
        "name": "dinosaurs",
        "type": "RECORD",
        "mode": "REQUIRED",
        "fields": [
            {
                "name": "dinosaur",
                "type": "RECORD",
                "mode": "REPEATED",
                "fields": [
                    {
                        "name": "appeared",
                        "type": "INTEGER"
                    },
                    {
                        "name": "height",
                        "type": "INTEGER"
                    },
                    {
                        "name": "length",
                        "type": "INTEGER"
                    },
                    {
                        "name": "order",
                        "type": "STRING"
                    },
                    {
                        "name": "vanished",
                        "type": "INTEGER"
                    },
                    {
                        "name": "weight",
                        "type": "INTEGER"
                    }
                ]
            },
            {
                "name": "scores",
                "type": "RECORD",
                "mode": "REPEATED",
                "fields": [
                    {
                        "name": "dinosaur",
                        "type": "INTEGER"
                    }
                ]
            }
        ]
    }
]

是否可以编写适合 Firebase 原始数据的表架构?还是我们应该先准备数据以使其与 BigQuery 兼容?

【问题讨论】:

    标签: json firebase google-bigquery


    【解决方案1】:

    由于上面的数据只是 JSON,您应该能够让它与 Firebase 一起使用。但是,我认为备份后准备数据会容易得多。

    您提到 Firebase 数据中没有数组。 Firebase does support arrays, but they have to meet a certain criteria.

    // we send this
    ['a', 'b', 'c', 'd', 'e']
    // Firebase stores this
    {0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e'}
    // since the keys are numeric and sequential,
    // if we query the data, we get this
    ['a', 'b', 'c', 'd', 'e']
    

    尽管它可能看起来像 Firebase 数据库中的一个对象,但在查询时它会以数组的形式返回。

    因此,在 Firebase 数据库中创建架构是可行的,但它可能会为您的应用程序带来大量开销。

    【讨论】:

    • 谢谢。我知道 Firebase 支持数组。我只是指恐龙事实数据库中的数据。我在 Firebase 中存储了许多用户配置文件,而不是恐龙。我认为,根据 Firebase 博客文章中的描述,升级到 Bonfire 计划后,使用 BigQuery 进行一些统计会非常容易。但实际上,准备数据需要做很多工作。
    • 啊,我明白了,感谢您的澄清!只是想确保您知道它将如何导出。让我知道你最终做了什么,或者如果你有任何其他问题:)
    • 您可以做的一件事是在将数据输入 Firebase 时将数据发送到 BigQuery。这将要求您运行支持 Firebase SDK(如 Node.js)或 JVM 客户端的服务器。您应该能够使用 Java 在 AppEngine 上运行 BigQuery 和 Firebase SDK。服务器只会监听更新并将它们发送到 BigQuery。 cloud.google.com/bigquery/bigquery-api-quickstart
    • 现在,我想我会要求退还篝火计划的费用。最好解释一下,将 Firebase 数据放入 BigQuery 并非易事。
    • 创建将数据导入 BigQuery 的脚本应该不会太难。您遇到了什么问题?
    【解决方案2】:

    在撰写本 03/2017 时,我可以确认 Firebase Realtime 数据库和 BigQuery 之间没有真正的集成。只有 Firebase Analytics 可以轻松导入 BigQuery。 Firebase 上也没有明确解释所有这些......

    我们最终编写了自己的解决方案,但您可以查看这个有 400 多颗星的Github repo,所以我假设一些人觉得它很有用...

    【讨论】:

      【解决方案3】:

      实际上 Big Query 只支持换行符分隔的 JSON 或 JSONL: https://cloud.google.com/bigquery/preparing-data-for-bigquery

      http://jsonlines.org/

      JSON Lines 是一种用于存储结构化数据的便捷格式,可能 一次处理一条记录。

      要准备 Firebase 数据以在 Big Query 中导入,我们只需:

      1. 从 Firebase(或在私有备份的情况下从 Cloud Storage 存储桶)获取 JSON
      2. 解析得到一个JS对象
      3. 循环遍历每条记录,对数据进行字符串化并添加行分隔符 var dataForBigQuery = ''; 对于(恐龙中的var i){ dataForBigQuery+= JSON.stringify(恐龙[i]) + '\n'; }
      4. 将这些数据保存在一个新文件中。然后即可将其导入 BigQuery。

      【讨论】:

        猜你喜欢
        • 2023-03-26
        • 1970-01-01
        • 2017-04-09
        • 1970-01-01
        • 2023-03-31
        • 2019-03-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多