在Apache箭头浏览器顶部的SQL?

时间:2019-06-15 00:36:14

标签: javascript webassembly apache-arrow dremio

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

"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存储中。以便对其执行查询。

有没有办法做到这一点?

2 个答案:

答案 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之类的单词也是如此,   readcountbytoppathdeletedworkoffset。   请查阅关键字的完整列表。

     

可以选择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中,我认为这些是选择。