Запись JSON со свойствами dict в хранилище данных Google Cloud - PullRequest
0 голосов
/ 10 ноября 2018

Использование Apache Beam (Python 2.7 SDK) Я пытаюсь записать файлы JSON как объекты в хранилище данных Google Cloud.

Образец 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 шагов,

  1. beam.io.ReadFromText (input_file_path)

  2. beam.ParDo (CreateEntities ())

  3. 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]

Это прекрасно работает для основных свойств. Однако, поскольку адрес сам по себе является объектом dict, он терпит неудачу. Я прочитал похожий пост .

Однако не удалось получить точный код для преобразования dict -> entity

Попытка ниже установить элемент адреса как сущность, но не работает,

element['addresses'] = entity_pb2.Entity()

Другие ссылки:

1 Ответ

0 голосов
/ 10 ноября 2018

Вы пытаетесь сохранить это как повторяющееся структурированное свойство?

ndb.StructuredProperty s появляются в потоке данных со сглаженными ключами, а для повторяющихся структурированных свойств каждое отдельное свойство в объекте структурированного свойства становится массивом,Поэтому я думаю, вам нужно написать это так:

datastore_helper.add_properties(entity, {
    ...
    "addresses.type": ["Billing", "Shipping"],
    "addresses.streetAddress": ["Street 7", "Street 6"],
    "addresses.city": ["Malmo", "Stockholm"],
    "addresses.postalCode": ["CR0 4UZ", "YYT IKO"],
})

В качестве альтернативы, если вы пытаетесь сохранить это как ndb.JsonProperty, вы можете сделать это:

datastore_helper.add_properties(entity, {
        ...
        "addresses": json.dumps(element['addresses']),
    })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...