将AWK命令转换为sqlite查询

时间:2015-06-22 12:11:06

标签: sql awk sqlite

我必须经常解析非常大的(abt 40Gb)文本文件(日志)。 通常AWK / grep足以满足我的需求,但是日志正在增长,现在我很好奇sqlite3是否允许我更有效地做同样的事情。 我选择sqlite作为我的测试,因为它在我的Linux机器上安装了开箱即用(SQLite版本3.6.4),更复杂的工具会在这个简单的任务中引入太多的开销。

这是我常用的awk查询之一(我在这个例子中简化了日志结构,实际上它包含50多个字段):

zcat log*.gz | awk -F'|' '{total+=$1;total+=$2;if($3==404){failed+=$1;failed+=$2}}END{print "Total="total,"\nfailed="failed,"\nRatio="failed/total}'

所以这里我们总结了变量'total'中的字段1和2的值,并且如果变量'failed'中的field3 == 404,我们另外将它们相加,然后通过除法计算比率。

我将我的日志转换为sqlite DB并准备开始性能测试...但发现sqlite不支持存储过程(我不是SQL人员,所以这是我第一次检查并启动sqlite ),现在我不清楚如何在变量中保留中间值

是否有一些解决方法(不使用存储过程)使用sqlite有效地执行相同的计算?

1 个答案:

答案 0 :(得分:1)

SQLite是一个嵌入式数据库,即它被设计为与“真实”数据库一起使用。编程语言。

有可能将该日志文件导入数据库文件,但拥有数据库的重点是存储数据,这既不是此问题的直接目标,也不是它提高了效率(实际上,额外的文件会使一切变慢)。

进行计算相对容易:

SELECT total, failed, failed/total AS ratio
FROM (SELECT SUM(col1 + col2) AS total,
             SUM(CASE col3 WHEN 404 THEN col1 + col2 END) AS failed
      FROM MyTable)

但这不是这个问题的缓慢部分,导入就是。

这是awk是工作的最佳工具的例子。