无法使用 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 表格创建)“未找到”
ImportError:无法从“google.cloud”(未知位置)导入名称“bigquery”