apply-hops

时间:2018-05-09 13:44:06

标签: sesam

我有一个包含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"]
            ]
          ]
        ]
      }]

1 个答案:

答案 0 :(得分:0)

之所以变慢,是因为此跳仅对merge-operationiec相等性在asset上进行索引查找。目前,其余的匹配是通过对这些实体进行迭代来完成的,如果初始查询返回了很多实体,这将很慢。

解决此问题的推荐方法是使用tuples函数。这样会建立一个综合索引,从而消除了缓慢的迭代过程。

但是,在此示例中,有一个gtelt子句使此操作更加困难。执行这些范围子句时,当前不支持索引。在这种情况下,我们可以做一些手动优化,因为我们看到范围仅在当前小时+ 15分钟内运行。因此,我们可以创建一个时间窗口,然后对它们执行gtelt操作。

提供以下输入:

{
  "_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", "*", "_*"]
      ]
    }
  }
}

这应该得到相同的结果,但是要快得多。