Json Firebase数据到Google BigQuery

Json Firebase数据到Google BigQuery,json,firebase,google-bigquery,Json,Firebase,Google Bigquery,Firebase提供。其中一个特色用例是“摄入分析产品”: 我在Firebase中有很多数据(导出到云存储桶时超过1GB),如Firebase产品中所述,我想将这些数据放入大查询中 但是,真的有可能编写一个适合Firebase原始数据的表模式吗? 让我们以Firebase文档中的数据库为例。 JSON如下所示: { “恐龙”:{ “bruhathkayosaurus”:{ “出现”:-7000000, “高度”:25 }, “兰博龙”:{ “出现”:-76000000, “高度”:2.1 } }

Firebase提供。其中一个特色用例是“摄入分析产品”:

我在Firebase中有很多数据(导出到云存储桶时超过1GB),如Firebase产品中所述,我想将这些数据放入大查询中

但是,真的有可能编写一个适合Firebase原始数据的表模式吗? 让我们以Firebase文档中的数据库为例。 JSON如下所示:

{
“恐龙”:{
“bruhathkayosaurus”:{
“出现”:-7000000,
“高度”:25
},
“兰博龙”:{
“出现”:-76000000,
“高度”:2.1
}
},
“分数”:{
“bruhathkayosaurus”:55岁,
“兰博龙”:21
}
}
要列出所有恐龙,我想唯一的方法是在bigQuery模式中使用记录字段。但BigQuery中的记录通常对应于导入的JSON中的数组。Firebase中没有数组,只有一个以恐龙名字作为关键名字的对象

这样的BigQuery表模式不起作用:


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

因为上面的数据只是JSON,您应该能够让它与Firebase一起工作。但是,我认为备份后准备数据要容易得多

您提到Firebase数据中没有数组

尽管它可能看起来像Firebase数据库中的对象,但在查询时它将作为数组返回


因此,在Firebase数据库中创建模式是可行的,但这可能会给应用程序带来大量开销。

事实上,大查询只支持换行符分隔的JSON或JSONL:

JSON行是一种方便的存储结构化数据的格式,可以 一次只能处理一条记录

要准备在大查询中导入Firebase数据,我们只需要:

  • 从Firebase获取JSON(如果是私有备份,则从云存储桶获取)
  • 解析它以获得JS对象
  • 循环遍历每条记录,字符串化数据并添加行分隔符 var dataForBigQuery = ''; for (var i in dinosaurs) { dataForBigQuery+= JSON.stringify(dinosaurs[i]) + '\n'; } var dataForBigQuery=''; for(恐龙中的变量i){ dataForBigQuery+=JSON.stringify(恐龙[i])+'\n'; }
  • 将这些数据保存到新文件中。然后,它将准备好导入BigQuery

  • 在写这篇2017年3月的文章时,我可以确认Firebase实时数据库和BigQuery之间没有真正的集成。只有Firebase分析可以轻松导入BigQuery。所有这些在Firebase上也没有清楚的解释


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

    谢谢。我知道Firebase支持阵列。我只是指恐龙事实数据库中的数据。我在Firebase中存储了许多用户配置文件,而不是恐龙。根据Firebase博客文章中的描述,我认为升级到篝火计划后,使用BigQuery进行一些统计将非常容易。但事实上,准备数据需要做很多工作。啊,我明白了,谢谢你澄清!只是想确保你知道它将如何出口。让我知道你最终会做什么,或者如果你有任何其他问题:)你可以做的一件事,就是在数据输入Firebase时将数据发送到BigQuery。这需要运行支持Firebase SDK的服务器,如Node.js或JVM客户端。您应该能够使用Java在AppEngine上运行BigQuery和Firebase SDK。服务器只需侦听更新并将其发送到BigQuery。从现在开始,我想我会简单地要求退还篝火计划的费用。应该更好地解释一下,将Firebase数据放入BigQuery并非易事。创建脚本将数据导入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"
                        }
                    ]
                }
            ]
        }
    ]
    
    // 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']
    
    var dataForBigQuery = ''; for (var i in dinosaurs) { dataForBigQuery+= JSON.stringify(dinosaurs[i]) + '\n'; }