Моделирование больших данных и запрос с python - PullRequest
1 голос
/ 01 мая 2020

Я впервые использую BigTable. Не могу понять, не понимаю ли я моделирования больших таблиц или как использовать библиотеку python.

Некоторые сведения о том, что я храню:

Я храню события временного ряда, скажем, с именем и сообщением из двух столбцов, мой rowkey - «# 200501163223», поэтому rowkey включает время в этом формате «% y% m% d% H% M% S»

Допустим, позже мне нужно было добавить еще один столбец с именем "type".

Кроме того, возможно, что в одну и ту же секунду могут быть два события.

Итак, это то, чем я заканчиваю, если я храню 2 события со вторым событием, имеющим дополнительный тип "data:


account#200501163223
  Outbox:name                               @ 2020/05/01-17:32:16.412000
    "name1"
  Outbox:name                               @ 2020/05/01-16:41:49.093000
    "name2"
  Outbox:message                            @ 2020/05/01-17:32:16.412000
    "msg1"
  Outbox:message                            @ 2020/05/01-16:41:49.093000
    "msg2"
  Outbox:type                               @ 2020/05/01-16:35:09.839000
    "temp"


Когда я запрашиваю этот ключ строки с помощью python библиотеки больших таблиц, я получаю словарь с именами столбцов в качестве ключей и данными в виде списка объектов Cell

" Ключ name и «message» будет иметь 2 объекта, а «type» будет иметь только один объект, поскольку он был только частью второго события.

У меня вопрос, как узнать, какое событие 1 или 2 что типовое значение temp принадлежит? Является ли эта модель неправильной, и я должен убедиться, что только одно событие может быть сохранено в ключе строки, что было бы трудно сделать ... или есть хитрость, которую я упускаю в библиотеке, чтобы иметь возможность соответствующим образом связать данные событий?

1 Ответ

1 голос
/ 01 мая 2020

Это отличный вопрос, таша, и кое-что, с чем я тоже сталкивался, поэтому спасибо, что задали его.

В Bigtable не существует понятия, что колонки должны быть соединены из одного и того же написать. Это может быть очень полезно для некоторых людей, поскольку у вас есть большая гибкость в отношении того, что вы можете делать с различными столбцами и версиями, но в вашем случае это вызывает эту проблему.

Лучший способ справиться с этим - два шага. .

  1. Убедитесь, что каждый раз при записи в строку вы используете одну и ту же метку времени для этой записи. Это будет выглядеть так:

        timestamp = datetime.datetime.utcnow()
    
        row_key = "account#200501163223"
    
        row = table.direct_row(row_key)
        row.set_cell(column_family_id,
                     "name",
                     "name1",
                     timestamp)
        row.set_cell(column_family_id,
                     "type",
                     "temp",
                     timestamp)
    
        row.commit()
    
  2. Затем, когда вы запрашиваете базу данных, вы можете применить фильтр, чтобы получить только самую последнюю версию или последние версии N, или сканирование на основе в диапазонах отметок времени.

    rows = table.read_rows(filter_=row_filters.CellsColumnLimitFilter(2))

Вот несколько фрагментов с примерами использования фильтра для чтения Bigtable. Они должны быть добавлены в документацию в ближайшее время.

...