静态文件的 SQL 查询工具和库
项目描述
描述
Squawk 是一个库和命令行工具,用于针对结构化/半结构化静态文件运行 SQL 查询。(例如 Apache 日志、csv 文件、tcpdump 输出)。
执照
BSD
见许可证
目标
Squawk 的目的是使查询日志文件或其他结构化文件中的数据更容易。Squawk 所做的一切都可以通过组合各种 unix 工具来完成,但 Squawk 使表达更复杂的关系变得更加容易。它绝不是一个数据库,也不打算这样使用。它只是一个报告工具。
Squawk 可以从命令行用于临时查询,也可以用作库作为更深入的报告工具的一部分。
地位
仍处于重大发展阶段。API 保证会发生变化。
要求
Python2.5 或更高版本 2.x
[pyparsing]( http://pyparsing.wikispaces.com/ )
支持的 SQL 功能
聚合:计数、最小值、最大值、平均值、总和
通过...分组
ORDER BY(单列)
限制
抵消
在哪里
列别名
FROM 中的子查询
从标准 SQL 出发
FROM 中的表列表使用空格而不是逗号作为分隔符。这使得在命令行上指定文件更容易。(例如 FROM access.log* )
解析器
常见的访问文件格式(nginx、apache)
CSV
输出格式
控制台的基本表格(如大多数数据库命令行工具)
JSON
CSV
例子
命令行上的 SQL 查询:
$ squawk "SELECT COUNT(1) AS n, status FROM access.log GROUP BY status ORDER BY n DESC" n | status ---------------------------------------- 381353 | 200 180668 | 302 17976 | 404 12952 | 301 10836 | 304 735 | 403 420 | 206 376 | 416 123 | 400 46 | 500 5 | 502 3 | 408 3 | 405 1 | 504
通过 API 进行基于 SQL 的查询:
query = Query(
"SELECT COUNT(1) AS n, remote_addr"
" FROM file"
" WHERE status = 200"
" AND remote_addr != '-'"
" GROUP BY remote_addr"
" ORDER BY n DESC"
" LIMIT 10")
source = AccessLogParser("access.log")
output_console(query(source))
# or
query = Query(
"SELECT COUNT(1) AS n, remote_addr"
" FROM file"
" WHERE status = 200"
" AND remote_addr != '-'"
" GROUP BY remote_addr"
" ORDER BY n DESC"
" LIMIT 10")
source = AccessLogParser("access.log")
for row in query(source):
print row
代码生成查询:
source = AccessLogParser("access.log")
filtered = Filter(source, lambda row:row['status'] == 200)
group_by = GroupBy(filtered, group_by=["remote_addr"], columns=[
lambda:Column('remote_addr'),
lambda:CountAggregate(None, 'count(1)')])
order_by = OrderBy(group_by, 'count(1)', True)
limit = LimitOffset(order_by, 10)
for row in limit:
print row