【发布时间】:2018-11-09 22:57:24
【问题描述】:
使用 Apache Beam(Python 2.7 SDK)我正在尝试将 JSON 文件作为实体写入 Google Cloud Datastore。
示例 JSON:
{
"CustId": "005056B81111",
"Name": "John Smith",
"Phone": "827188111",
"Email": "john@xxx.com",
"addresses": [
{"type": "Billing", "streetAddress": "Street 7", "city": "Malmo", "postalCode": "CR0 4UZ"},
{"type": "Shipping", "streetAddress": "Street 6", "city": "Stockholm", "postalCode": "YYT IKO"}
]
}
我编写了一个 Apache Beam 管道,主要包含 3 个步骤,
beam.io.ReadFromText(input_file_path)
beam.ParDo(CreateEntities())
WriteToDatastore(项目)
在第 2 步中,我将 JSON 对象(dict)转换为实体,
class CreateEntities(beam.DoFn):
def process(self, element):
element = element.encode('ascii','ignore')
element = json.loads(element)
Id = element.pop('CustId')
entity = entity_pb2.Entity()
datastore_helper.add_key_path(entity.key, 'CustomerDF', Id)
datastore_helper.add_properties(entity, element)
return [entity]
这适用于基本属性。但是,由于 address 本身是一个 dict 对象,因此它失败了。 我读过类似的post。
但是没有得到转换dict的确切代码->实体
下面尝试将地址元素设置为实体但不起作用,
element['addresses'] = entity_pb2.Entity()
其他参考资料:
【问题讨论】:
标签: python-2.7 google-cloud-datastore google-cloud-dataflow