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

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


person David542    schedule 15.06.2019    source источник
comment
Используя jslinq, см. stackoverflow.com/a/4720522/3408531.   -  person TiyebM    schedule 19.06.2019
comment
@TiyebM Я имею в виду буквально запуск SQL. Не его вариант.   -  person David542    schedule 20.06.2019
comment
@TiyebM, хотя, если вы можете запустить вышеуказанный sql с помощью jslinq, мне было бы интересно посмотреть, как это будет, это было бы довольно аккуратно!   -  person David542    schedule 20.06.2019
comment
См.: stackoverflow.com/questions/18052645/   -  person anbcodes    schedule 20.06.2019
comment
@anbcodes интересно.   -  person David542    schedule 21.06.2019
comment
Возможно ли использование соединений WebSocket и выполнение запросов на сервере?   -  person Lajos Arpad    schedule 23.06.2019
comment
Почему у вас есть бинарное поле в предложении «где»? Что вы ожидаете, например, если есть три Tom? Вероятно, есть более органичные способы JS для решения вашей реальной проблемы.   -  person rob3c    schedule 23.06.2019
comment
@ rob3c, конечно. Это просто выдуманные данные, чтобы показать пример SQL, который я хочу запустить.   -  person David542    schedule 24.06.2019


Ответы (2)


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

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

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

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

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

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

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

(ПОЛНОЕ) ВНЕШНЕЕ СОЕДИНЕНИЕ и ПРАВОЕ СОЕДИНЕНИЕ более чем двух таблиц не дадут ожидаемых результатов. INNER JOIN и LEFT JOIN в порядке.

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

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

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

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

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

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

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

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

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

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

person Hash    schedule 23.06.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>

person Todd Chaffee    schedule 23.06.2019