我的数据存储在客户端的浏览器中。例如,假设数据集如下:
"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。作为最后的选择,我认为可以使用sqllite in wasm,但我希望可以采用一种更简单的方法直接查询Arrow数据,而不必将其全部移至sqllite存储中。以便对其执行查询。
有没有办法做到这一点?
答案 0 :(得分:0)
您可以使用javadoc做一些您想做的事,但是它不支持分组。
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>
答案 1 :(得分:0)
您正在寻找的好东西。 :)遗憾的是,据我所知〜2010年的一些趋势,尚无针对此目的积极维护和支持的API。 但是...
如果要在客户端的内存中拥有完整的ANSI SQL
,并且愿意填充数据库,则可以运行上述的SQLite
。也许这对您来说是唯一令人满意的选择(如果您无法满足某些要求)。
如果您可以允许奢侈地复制数据,则可以签出AlaSQL
project,它支持join
-s和某些ANSI SQL功能,但是还不完善,其中包含已知的disruptive bugs:
请注意,AlaSQL有错误。除了有一些错误,还有 有很多限制:
AlaSQL有一个(长)关键字列表,如果用于 列名。选择名为key的字段时,请输入SELECT
key
FROM...。value
之类的单词也是如此,read
,count
,by
,top
,path
,deleted
,work
和offset
。 请查阅关键字的完整列表。可以选择1000000条记录或使用10000连接两个表 每个记录(您可以使用流式处理功能来处理更长的时间 数据源-请参阅test / test143.js),但要注意 相乘,以便从8个以上的表中进行选择,而其中仅包含100行 每个都会显示不良的性能。这是我们的首要任务之一 变得更好。
交易的受限功能(仅支持 localStorage)-对不起,由于AlaSQL,交易受到限制 切换到更复杂的方法来处理主键/ FOREIGN 按键。在将来的版本中,事务将再次完全打开。
超过2个表的(全)外部联接和右联接将不会 产生预期的结果。内联接和左联接都可以。
当您要从中使用相同名称的字段时,请使用别名 不同的表(SELECT a.id AS a_id,b.id AS b_id FROM?)。
目前,AlaSQL不适用于JSZip 3.0.0-请使用 版本2.x。
加入子SELECT无效。请使用with结构 (此处为示例)或将子SELECT提取到变量中并将其作为 参数(此处为示例)。
AlaSQL使用FileSaver.js库从本地保存文件。 浏览器。请注意,它不会在Safari 8.0中保存文件。
可能还有很多其他人。请通过提交来帮助我们修复它们 一个问题。谢谢!
我们计划在一个项目中使用它,但是在将项目引入我们的堆栈时,存在的问题比解决方案(对我们而言)更多。所以我们退出了。因此,我没有使用此软件的生产经验...
在较早的时候,我希望 Google Gears
将支持所需的功能,但部分由HTML5
客户端存储代替,而不幸的是,项目获得了{{3 }}
discontinued. 对于您的用例来说是完美的,但遗憾的是HTML5 WebSQL Database
。在2019年,大多数(?)浏览器仍然支持它。您可以查看一些示例depricated。如果您可以允许您在特定的API上进行构建,那么这可能是解决方案,但是我不建议您这样做,因为它不能保证它将正常工作。
当我们的项目运行时遇到同样的问题时,我们最终不得不使用here并对每个“ SELECT”进行手动编程,这当然根本不是像ANSI SQL那样...
如果我们回滚到原始问题,则“ [SQL]直接查询Arrow数据” 。我不介意使用适配器将其用作SQL ...这类操作仍然倾向于在服务器端和wasm SQLite中,我认为这些是选择。