15

我有存储在客户端浏览器内存中的数据。例如,假设数据集如下:

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

我想在 javascript 中对这些数据运行重要的 SQL 语句,例如:

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一起使用),我也想对该 apache Arrow 数据执行 SQL。作为最后的手段,我认为可以在 wasm 中使用 sqllite,但我希望有一种更简单的方法可以直接查询 Arrow 数据,而无需将其全部移动到 sqllite 存储中以便对其执行查询。

有没有办法做到这一点?

4

2 回答 2

0

你可以使用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>

于 2019-06-23T16:05:52.937 回答
0

这是你正在寻找的好东西。:) 遗憾的是,据我所知,由于 ~2010 年的一些趋势,没有为此积极维护和支持的 API。但...

如果您想ANSI SQL在内存中拥有完整的客户端并且您愿意填充数据库,您可以运行提到的SQLite. 也许这对你来说是唯一令人满意的选择(如果你不能离开一些要求)。

如果您可以奢侈地复制数据,您可以查看它支持的AlaSQL项目-s 和一些 ANSI SQL 功能,但它并不完整,并且包含已知的破坏性错误join

请注意 AlaSQL 有错误。除了有一些错误之外,还有许多限制:

AlaSQL 有一个(长)关键字列表,如果用于列名,则必须对其进行转义。选择名为 key 的字段时,请改写 SELECT keyFROM ...。value, read, count, by, top, path, deleted,work和等词也是如此offset。请查阅完整的关键字列表。

可以选择 1000000 条记录或加入两个表,每个表有 10000 条记录(您可以使用流式处理函数来处理更长的数据源 - 请参阅 test/test143.js),但请注意工作负载会成倍增加,因此从超过 8 个中选择每个只有 100 行的表会表现出糟糕的性能。这是我们做得更好的首要任务之一。

事务的有限功能(仅支持 localStorage) - 抱歉,事务是有限的,因为 AlaSQL 切换到更复杂的方法来处理主键/外键。交易将在未来的版本中再次完全开启。

超过 2 个表的 (FULL) OUTER JOIN 和 RIGHT JOIN 不会产生预期结果。INNER JOIN 和 LEFT JOIN 都可以。

当您想要来自不同表的具有相同名称的字段时,请使用别名(SELECT a.id AS a_id, b.id AS b_id FROM ?)。

目前 AlaSQL 不适用于 JSZip 3.0.0 - 请使用 2.x 版本。

加入子选择不起作用。请使用 with 结构(此处为示例)或将子 SELECT 获取到变量并将其作为参数传递(此处为示例)。

AlaSQL 使用 FileSaver.js 库从浏览器本地保存文件。请注意,它不会在 Safari 8.0 中保存文件。

可能还有很多其他人。请通过提交问题帮助我们修复它们。谢谢!

我们计划在一个项目中使用它,但在将项目引入我们的堆栈时,问题多于解决方案(对我们而言)。所以我们退出了它。所以我没有这个软件的制作经验......

在较早的时候,我希望这Google Gears将支持所需的功能,但部分它被HTML5客户端存储所取代,遗憾的是该项目已停止

对于您的用例来说是完美的,但遗憾的是它被贬低了。尽管大多数(?)浏览器在 2019 年仍然支持它。您可以在此处查看一些示例。如果您可以允许自己在已弃用的 API 上进行构建,这可能是解决方案,但我并不真正推荐它,因为不能保证它会起作用......HTML5 WebSQL Database

当我们的项目运行时遇到同样的问题时,我们最终不得不使用localStorage并手动编写每个“SELECT”,这当然不像 ANSI SQL...

如果我们回滚到最初的问题“[SQL] 直接查询 Arrow 数据”,我没有考虑将其用作 SQL 的适配器......这些操作仍然倾向于在服务器端,并且使用 wasm SQLite 我认为这些是选项。

于 2019-06-23T16:06:57.637 回答