无法使用 BigQuery 从 Google Datastore 检索 JSON 实体

Posted

技术标签:

【中文标题】无法使用 BigQuery 从 Google Datastore 检索 JSON 实体【英文标题】:Fail to retrieve JSON entity from Google Datastore using BigQuery 【发布时间】:2018-02-09 12:09:24 【问题描述】:

我正在尝试将实体从 Google 数据存储导出到 Big Query(然后导出到 CSV)。

当我创建数据集时,一切都很好,除了一个应该是 JSON 的缺失变量。(ndb.JsonProperty())

查看数据存储区中的这个实体变量,它似乎是一个编码的 JSON(例如:...0NzIyMDUyODkiLCAidXNlcl9uYW1lIjogIlZpbmNlbnQgR...)

我的唯一目的是使用 Big Query、Python 或任何需要的工具从数据存储中导出该实体,以便探索数据。

【问题讨论】:

【参考方案1】:

ndb JsonProperty 值以blobs 的形式存储在数据存储区中:

JsonProperty Value 是一个 Python 对象(如列表或字典或字符串),可使用 Python 的 json 模块进行序列化; Cloud Datastore 将 JSON 序列化存储为 Blob。

BigQuery discards blob data:

Blob BigQuery 在加载数据时会丢弃这些值。

一种可能的解决方法是在您的模型上创建Computed Properties,以 BigQuery 可接受的格式提取您感兴趣的数据。

例如,假设您将这样的dict 存储在您的JsonProperty 中:

data = 'foo': 'bar', 'baz': 'quux'

假设您对键 foo 对应的值感兴趣。您可以创建一个返回值的 ComputedProperty,这将由您的 BigQuery 导出获取(请注意,在添加 ComputedProperty 以填充新属性后,您必须保存所有模型实例)。

class MyModel(ndb.Model):

   blob = ndb.JsonProperty()
   foo = ndb.ComputedProperty(lambda self: self.blob.get('bar'))

obj = MyModel(blob=data)
obj.put()
obj.foo
'bar'

【讨论】:

这澄清了,谢谢。不过,我不确定是否理解您的最后一个示例:'bar' 参考了什么? self.blob 是对您在上面定义的 blob 的引用还是对 blob 类型的引用?最后,这是否意味着将我现有的 blob 变量转换为可读的变量,还是仅适用于将来创建的变量?

以上是关于无法使用 BigQuery 从 Google Datastore 检索 JSON 实体的主要内容,如果未能解决你的问题,请参考以下文章

由于数据类型,无法查询从 Google 表格加载的 BigQuery 表

Google 数据准备 - 无法从 BigQuery 导入表(从 Google 表格创建)“未找到”

BigQuery数据类型

ImportError:无法从“google.cloud”(未知位置)导入名称“bigquery”

Bigquery 无法从 Google Cloud Storage 加载数据

无法将 Google Ads 连接到 BigQuery