【问题标题】:Fail to retrieve JSON entity from Google Datastore using BigQuery无法使用 BigQuery 从 Google Datastore 检索 JSON 实体
【发布时间】:2023-04-03 03:02:01
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: python json google-app-engine google-bigquery google-cloud-datastore


    【解决方案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 变量转换为可读的变量,还是仅适用于将来创建的变量?
    猜你喜欢
    • 2019-10-19
    • 1970-01-01
    • 2019-08-07
    • 1970-01-01
    • 2018-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多