SQL поверх стрелки apache в браузере? - PullRequest
9 голосов
/ 15 июня 2019

У меня есть данные, которые хранятся в памяти браузера клиента. Например, скажем, набор данных выглядит следующим образом:

"name" (string),     "age" (int32),   "isAdult" (bool)
"Tom"          ,     29               1
"Tom"          ,     14               0
"Dina"         ,     20               1

Я хотел бы запустить нетривиальные операторы SQL для этих данных в javascript, например:

SELECT name, GROUP_CONCAT(age ORDER BY age) ages
FROM arrowData a1 JOIN arrowData a2 USING (name)
WHERE a1.isAdult != a2.isAdult

И я бы получил:

"name" (string),      "ages" (string)
"Tom"                 "14,29"

Данные, которые у меня есть в javascript, хранятся в виде Apache Arrow (также используется в связи с Perspective ), и я хотел бы также выполнить SQL для этих данных Apache Arrow. В крайнем случае, я думаю, что было бы возможно использовать sqllite в wasm , но я надеюсь, что может быть более простой способ, где я могу напрямую запрашивать данные Arrow, не перемещая их все в хранилище sqllite для выполнения запроса к нему.

Есть ли способы сделать это?

Ответы [ 2 ]

0 голосов
/ 23 июня 2019

Это хороший материал, который вы ищете.:) К сожалению, благодаря некоторым тенденциям в ~ 2010, насколько я знаю, нет активно поддерживаемого и поддерживаемого API для этого. Но ...

Если вы хотите заполнить ANSI SQL на стороне клиента в памяти и хотите заполнить базу данных, вы можете запустить упомянутуюSQLite.Возможно, это единственный вариант для вас (если вы не можете оставить некоторые требования).

Если вы можете позволить роскоши копировать данные, вы можете проверить AlaSQL проект это поддерживает join -s и некоторые функции ANSI SQL, но он не завершен и содержит известные разрушительные ошибки :

Обратите внимание, что в AlaSQL есть ошибки.Помимо некоторых ошибок, есть ряд ограничений:

AlaSQL имеет (длинный) список ключевых слов, которые необходимо экранировать, если они используются для имен столбцов.При выборе поля с именем key напишите вместо этого SELECT key FROM ...Это также относится к таким словам, как value, read, count, by, top, path, deleted, work и offset.Пожалуйста, ознакомьтесь с полным списком ключевых слов.

Можно ВЫБРАТЬ 1000000 записей или СОЕДИНИТЬ две таблицы с 10000 записями в каждой (Вы можете использовать функции потоковой передачи для работы с более длинными источниками данных - см. Test / test143.js)но имейте в виду, что рабочая нагрузка умножается, поэтому выбор из более чем 8 таблиц, содержащих по 100 строк в каждой, покажет плохую производительность.Это один из наших главных приоритетов для улучшения ситуации.

Ограниченная функциональность для транзакций (поддерживается только для localStorage) - Извините, транзакции ограничены, потому что AlaSQL переключился на более сложный подход для обработки ПЕРВИЧНЫХ КЛЮЧЕЙ / ИНОСТРАННЫХ КЛЮЧЕЙ.Транзакции будут полностью включены снова в следующей версии.

A (FULL) OUTER JOIN и RIGHT JOIN для более чем 2 таблиц не приведут к ожидаемым результатам.INNER JOIN и LEFT JOIN в порядке.

Пожалуйста, используйте псевдонимы, если вы хотите, чтобы поля с одинаковыми именами из разных таблиц (SELECT a.id AS a_id, b.id AS b_id FROM?).

В настоящее время AlaSQL не работает с JSZip 3.0.0 - пожалуйста, используйте версию 2.x.

Присоединение к sub-SELECT не работает.Пожалуйста, используйте структуру with (Пример здесь) или извлеките sub-SELECT в переменную и передайте его в качестве аргумента (Пример здесь).

AlaSQL использует библиотеку FileSaver.js для локального сохранения файлов из браузера.Помните, что в Safari 8.0 файлы не сохраняются.

Возможно, есть много других.Пожалуйста, помогите нам исправить их, представив проблему.Спасибо!

Мы планировали использовать его в одном проекте, но было больше проблем, чем решений (для нас) при представлении проекта в наш стек.Таким образом, мы отступили от этого.Так что у меня нет опыта производства с этим программным обеспечением ...

Раньше я надеялся, что Google Gears будет поддерживать что-то вроде желаемой функции, но частично ее заменили на HTML5 хранилище на стороне клиента и, к сожалению, проект получил прекращено .

HTML5 WebSQL Database будет иметьидеально подходит для вашего варианта использования, но, к сожалению, ограничен .В большинстве (?) Браузеров он все еще поддерживается в 2019 году. Некоторые примеры можно посмотреть здесь .Если вы можете позволить себе использовать устаревший API, это может быть решением, но я не очень рекомендую его, поскольку не гарантируется, что он будет работать ...

Когда наш проект запускается с такими же проблемаминам пришлось использовать localStorage и запрограммировать каждый «SELECT» вручную, что, конечно, совсем не было похоже на ANSI SQL ...

Если мы вернемся к исходной проблеме "[SQL] запросит данные стрелки напрямую" У меня нет адаптера, чтобы использовать его в качестве SQL ... Такие операции по-прежнему выполняются на стороне сервера и с wasm SQLite, я думаю, что это варианты.

0 голосов
/ 23 июня 2019

Вы можете использовать Alasql , чтобы делать то, что вам нужно, но он не поддерживает группировку.

var data = [
  {
    name: 'Tom',
    age: 29,
    isAdult: 1
  },
  {
    name: 'Tom',
    age: 14,
    isAdult: 0
  },
  {
    name: 'Dina',
    age: 20,
    isAdult: 1
  }
];

var res = alasql('SELECT name, age from ? a1 JOIN ? a2 WHERE a1.isAdult != a2.isAdult AND a1.name = a2.name', [data, data]);
  
document.getElementById('result').textContent = JSON.stringify(res);
<script src="https://cdn.jsdelivr.net/alasql/0.2/alasql.min.js"></script> 

<span id="result"></span>
...