Требует ли Crossfilter плоской структуры данных?

Все примеры Crossfilter, которые я нашел, используют плоскую структуру следующим образом:

[
  { name: "Rusty",  type: "human", legs: 2 },
  { name: "Alex",   type: "human", legs: 2 },
  ...
  { name: "Fiona",  type: "plant", legs: 0 }
]

или

"date","open","high","low","close","volume","oi" 11/01/1985,115.48,116.78,115.48,116.28,900900,0 11/04/1985,116.28,117.07,115.82,116.04,753400,0 11/05/1985,116.04,116.57,115.88,116.44,876800,0

У меня есть сотни МБ плоских файлов, которые я обрабатываю, чтобы получить объект JSON размером 1-2 МБ со структурой примерно так:

{
  "meta": {"stuff": "here"},
  "data": {
    "accountName": {
      // rolled up by week
      "2013-05-20": {
        // any of several "dimensions"
        "byDay": {
          "2013-05-26": {
            "values": {
              "thing1": 1,
              "thing2": 2,
              "etc": 3
            }
          },
          "2013-05-27": {
            "values": {
              "thing1": 4,
              "thing2": 5,
              "etc": 6
            }
          }
          // and so on for day
        },
        "bySource": {
          "sourceA": {
            "values": {
              "thing1": 2,
              "thing2": 6,
              "etc": 7
            }
          },
          "sourceB": {
            "values": {
              "thing1": 3,
              "thing2": 1,
              "etc": 2
            }
          }
        }
      }
    }
  }
}

Что я хотел бы отображать в виде таблицы, например:

Group: byDay* || bySource || byWhatever

           | thing1 | thing2 | etc
2013-05-26 |      1 |      2 |   2
2013-05-27 |      4 |      5 |   7

или

Group: byDay || bySource* || byWhatever

           | thing1 | thing2 | etc
sourceA    |      2 |      6 |   6
sourceB    |      3 |      1 |   3

Сглаживание этой структуры JSON будет затруднено и даст очень большой объект.

Я бы хотел воспользоваться замечательными функциями Crossfilter, но я не уверен, если это возможно.

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

Ответ 1

Crossfilter работает с массивом записей, причем каждый элемент массива сопоставляется с одним или несколькими значениями через измерения (которые определяются с помощью функций доступа).

Даже если ваши данные содержат совокупные результаты, вы можете использовать это с Crossfilter, но обратите внимание, что технически невозможно объединить данные, которые были объединены в разных измерениях, например, объединение "по дням", и "по источникам" в приведенном выше примере. Вы можете создать Crossfilter для каждого агрегированного измерения, например. один для "по дням", и запускать запросы и группы по этому вопросу, но я не уверен, насколько полезен это сравнение с тем, что у вас уже есть.

Что касается использования памяти, уверены ли вы, что выравнивание вашей сплющенной структуры действительно было бы проблематичным? Имейте в виду, что каждая запись (элемент сплющенного массива) может содержать ссылки для строк и других объектов в вашей вложенной структуре, поэтому вы не обязательно будете использовать всю эту память.