SQL поверх стрелки apache в браузере?

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

"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 (также используется в связи с перспективой), и я хотел бы также выполнить SQL для этих данных Apache Arrow. В крайнем случае, я думаю, что было бы возможно использовать sqllite в wasm, но я надеюсь, что мог бы быть более простой способ, где я мог бы напрямую запрашивать данные Arrow, не перемещая их все в хранилище sqllite, чтобы выполнить запрос по нему.

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

3 ответа

Теперь есть DuckDB Wasm, который может запускать SQL на таблицах со стрелками.

DuckDB-Wasm — это внутрипроцессная аналитическая база данных SQL для браузера. Он основан на WebAssembly, свободно говорит на языке Arrow, читает файлы Parquet, CSV и JSON, поддерживаемые API-интерфейсами файловой системы или HTTP-запросами, и был протестирован с Chrome, Firefox, Safari и Node.js.

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

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

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

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

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

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

Ограниченная функциональность для транзакций (поддерживается только для localStorage) - Извините, транзакции ограничены, потому что AlaSQL переключился на более сложный подход для обработки PRIMARY KEYs / FOREIGN KEYs. Транзакции будут полностью включены снова в будущей версии.

A (FULL) OUTER JOIN и RIGHT JOIN для более чем двух таблиц не приведут к ожидаемым результатам. ВНУТРЕННЕЕ СОЕДИНЕНИЕ и ЛЕВОЕ СОЕДИНЕНИЕ в порядке.

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

На данный момент AlaSQL не работает с JSZip 3.0.0 - используйте версию 2.x.

СОЕДИНЕНИЕ к ПОДБОРУ не работает. Пожалуйста, используйте структуру with (Пример здесь) или извлеките sub-SELECT в переменную и передайте его в качестве аргумента (Пример здесь).

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

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

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

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

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

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

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

Вы можете использовать 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>

Другие вопросы по тегам