我正在尝试找到在 Redshift 中表示和聚合高基数列的最佳方式。源是基于事件的,看起来像这样:
| 用户 | 时间戳 | 事件类型 |
|---|---|---|
| 1 | 2021-01-01 12:00:00 | 富 |
| 1 | 2021-01-01 15:00:00 | 酒吧 |
| 2 | 2021-01-01 16:00:00 | 富 |
| 2 | 2021-01-01 19:00:00 | 富 |
在哪里:
我想将这些数据聚合成一个更小的数据集,每个用户只有一条记录(文档)。这些文件随后将被导出。感兴趣的聚合是这样的:
但是也:
我发现后一种情况很困难。
解决此问题的简单“列数据库友好”方法就是为每个事件类型创建一个聚合列:
| 用户 | nb_事件 | ... | NB_foo | nb_bar |
|---|---|---|---|---|
| 1 | 2 | ... | 1 | 1 |
| 2 | 2 | ... | 2 | 0 |
但我认为这不是一个合适的解决方案,因为 event_type 字段是动态的,可能有数百或数千个值(Redshift 的上限为 1600 列)。而且,这个 event_type 字段上可能有多种类型的聚合(不仅仅是count)。
第二种方法是将数据保持垂直形式,其中不是每个用户一行,而是每个(user, event_type)一行。然而,这实际上只是推迟了问题——在某些时候,数据仍然需要聚合成每个用户的单个记录以实现目标文档结构,并且列爆炸的问题仍然存在。
该数据的更自然的(我认为)表示是稀疏数组/文档/SUPER:
| 用户 | nb_事件 | ... | 按事件类型计数(超级) |
|---|---|---|---|
| 1 | 2 | ... … |
我正在编写我的第一个简单的 Chrome 扩展程序,它应该根据下载的选项卡的标题将下载内容组织到子文件夹中。我计划将来扩展它,但目前我什至无法让这个简单的功能发挥作用。问题似乎是无法从异步选项卡查询中调用“文件名建议”函数。下面的代码是后台JavaScript文件的完整内容:
chrome.downloads.onDeterminingFilename.addListener(function (item, __suggest) {
//Find active tab
chrome.tabs.query({ active: true }, function (tabs) {
var activeTab = tabs[0];
//Generate filepath
var filepath = activeTab.title + "/" + item.filename;
//TODO: Sanitize filepath.
//Suggest filename for this download.
__suggest({ filename: filepath });
})
});
Run Code Online (Sandbox Code Playgroud)
控制台记录的错误是:
suggestCallback may not be called more than once. (extensions::downloads:42)
Run Code Online (Sandbox Code Playgroud)
我已经检查过建议函数(在我的 JS 中)肯定只被调用一次。我有什么想法可以解决/解决这个问题吗?