渠道分析通常是通过获取基本数据来完成的,然后从该数据中进行子查询以查看可以将多少数据存储到该部分中。一个很好的用例是:
User signup (1,290) ==> Sign in (897) ==> User purchase (42)
我正在尝试分析各种日志以进行序列/异常检测。与常规渠道分析不同,事件的顺序和时间戳非常重要。让我们以下面的示例为例,当用户打开文本编辑器然后发出网络请求时,我们试图标记可疑活动(例如恶意软件安装)。日志如下所示:
[2019-07-14 17:54:04,251] generic.py:98@main [INFO] File opened
[2019-07-14 17:56:03,566] generic.py:98@main [INFO] Network request made
[2019-07-14 17:58:03,883] generic.py:98@main [INFO] File closed
由于文件打开后立即发出了网络请求,因此我们将其标记为可疑。
但是,这并不是可疑的:
[2019-07-14 17:54:04,251] generic.py:98@main [INFO] File opened
[2019-07-14 17:58:05,883] generic.py:98@main [INFO] File closed
[2019-07-14 17:56:06,566] generic.py:98@main [INFO] Network request made
并且,我们还将从首次打开文件到发出网络请求的时间限制设置为“ 10秒”。因此,这也不会被标记为可疑:
[2019-07-14 17:54:04,251] generic.py:98@main [INFO] File opened
[2019-07-14 18:56:06,566] generic.py:98@main [INFO] Network request made
[2019-07-14 18:58:05,883] generic.py:98@main [INFO] File closed
当前,这是通过for
循环和许多用于检查条件的内部对象来完成的。但是,我想知道是否可以在SQL中直接进行这种类型的“错误检测”,因为这样会更快(如果可能),并且我可以轻松地以timestamp / action
的形式使用数据,例如:
session_id timestamp action
123 2019-07-14 17:54:04,251 file_opened
123 2019-07-15 17:54:04,251 network_request
123 2019-07-16 17:54:04,251 file_closed
所以,回到上面的问题:
答案 0 :(得分:1)
SQL是一种查询语言,不适用于计算。此外,数据库也不是为计算而设计的。它专注于写,读,存储,一致性等,但不包括计算。
因此,在这种情况下,我认为SQL可以用于您的简单示例,但由于过于复杂,因此它不适合您的实际情况。
回到计算,这取决于数据量。对于相对简单的任务,我们通常使用__init__(result)
,pandas
,scipy
作为工具。对于某些繁重的任务,我们可能使用numpy
作为计算引擎,并使用连接器将spark与数据库连接,然后使用spark
处理数据。
这是根据您给出的示例的pyspark
的示例:
pandas