我有一个包含3000个entites的数据集,我从另一个具有相似大小的数据集跳转到该数据集。性能一直很差,需要15-20分钟才能完成管道。
我的目标是检索15分钟内的元素。例如16:45和17:00,这也是资产和车站的匹配。
怎么样
["apply-hops", "state", {
"datasets": ["merge-operationiec mo"],
"where": [
["eq", "_S.asset", "mo.asset"],
["eq", "_S.station", "mo.station"],
["gte",
["datetime-parse", "%Y-%m-%d %H:%M", "mo.timestamp"],
["datetime-parse", "%Y-%m-%d %H:%M", "_S.timestamp"]
],
["lt",
["datetime-parse", "%Y-%m-%d %H:%M", "mo.timestamp"],
["datetime-plus", "minute", 15,
["datetime-parse", "%Y-%m-%d %H:%M", "_S.timestamp"]
]
]
]
}]
答案 0 :(得分:0)
之所以变慢,是因为此跳仅对merge-operationiec
相等性在asset
上进行索引查找。目前,其余的匹配是通过对这些实体进行迭代来完成的,如果初始查询返回了很多实体,这将很慢。
解决此问题的推荐方法是使用tuples
函数。这样会建立一个综合索引,从而消除了缓慢的迭代过程。
但是,在此示例中,有一个gte
和lt
子句使此操作更加困难。执行这些范围子句时,当前不支持索引。在这种情况下,我们可以做一些手动优化,因为我们看到范围仅在当前小时+ 15分钟内运行。因此,我们可以创建一个时间窗口,然后对它们执行gte
和lt
操作。
提供以下输入:
{
"_id": "timeseries-a-original",
"type": "pipe",
"source": {
"type": "embedded",
"entities": [{
"_id": "a1",
"asset": "foo",
"station": "bar",
"timestamp": "2018-08-31 00:45"
}, {
"_id": "a2",
"asset": "foo",
"station": "bar",
"timestamp": "2018-08-31 01:00"
}, {
"_id": "a3",
"asset": "foo",
"station": "bar",
"timestamp": "2018-08-31 01:15"
}, {
"_id": "a4",
"asset": "foo",
"station": "bar",
"timestamp": "2018-08-31 01:30"
}]
}
}
和
{
"_id": "merge-operationiec-original",
"type": "pipe",
"source": {
"type": "embedded",
"entities": [{
"_id": "b1",
"asset": "foo",
"station": "bar",
"timestamp": "2018-08-31 00:45",
"value": "~f0.02"
}, {
"_id": "b2",
"asset": "foo",
"station": "bar",
"timestamp": "2018-08-31 01:00",
"value": "~f0.04"
}, {
"_id": "b3",
"asset": "foo",
"station": "bar",
"timestamp": "2018-08-31 01:15",
"value": "~f0.03"
}, {
"_id": "b4",
"asset": "foo",
"station": "bar",
"timestamp": "2018-08-31 01:30",
"value": "~f0.06"
}]
}
}
然后我们可以添加时间窗口(注意,我们需要一个两个小时的窗口来解决日期边界上的问题):
{
"_id": "timeseries-a",
"type": "pipe",
"source": {
"type": "dataset",
"dataset": "timeseries-a-original"
},
"transform": {
"type": "dtl",
"rules": {
"default": [
["copy", "*"],
["add", "time-window",
["list",
["datetime-format", "%Y-%m-%d %H",
["datetime-parse", "%Y-%m-%d %H:%M", "_S.timestamp"]
],
["datetime-format", "%Y-%m-%d %H",
["datetime-plus", "hour", 1,
["datetime-parse", "%Y-%m-%d %H:%M", "_S.timestamp"]
]
]
]
]
]
}
}
}
,其他时间序列相同:
{
"_id": "merge-operationiec",
"type": "pipe",
"source": {
"type": "dataset",
"dataset": "merge-operationiec-original"
},
"transform": {
"type": "dtl",
"rules": {
"default": [
["copy", "*"],
["add", "time-window",
["list",
["datetime-format", "%Y-%m-%d %H",
["datetime-parse", "%Y-%m-%d %H:%M", "_S.timestamp"]
],
["datetime-format", "%Y-%m-%d %H",
["datetime-plus", "hour", 1,
["datetime-parse", "%Y-%m-%d %H:%M", "_S.timestamp"]
]
]
]
]
]
}
}
}
然后我们可以使用元组和时间窗口来优化您发布的跃点,如下所示:
{
"_id": "timeseries-join",
"type": "pipe",
"source": {
"type": "dataset",
"dataset": "timeseries-a"
},
"transform": {
"type": "dtl",
"rules": {
"default": [
["add", "related",
["apply-hops", "state", {
"datasets": ["merge-operationiec mo"],
"where": [
["eq",
["tuples", "_S.asset", "_S.station", "_S.time-window"],
["tuples", "mo.asset", "mo.station", "mo.time-window"]
],
["gte",
["datetime-parse", "%Y-%m-%d %H:%M", "mo.timestamp"],
["datetime-parse", "%Y-%m-%d %H:%M", "_S.timestamp"]
],
["lt",
["datetime-parse", "%Y-%m-%d %H:%M", "mo.timestamp"],
["datetime-plus", "minute", 15,
["datetime-parse", "%Y-%m-%d %H:%M", "_S.timestamp"]
]
]
]
}]
]
],
"state": [
["copy", "*", "_*"]
]
}
}
}
这应该得到相同的结果,但是要快得多。