【问题标题】:Simple, fast SQL queries for flat files简单、快速的平面文件 SQL 查询
【发布时间】:2011-01-17 16:33:24
【问题描述】:

有没有人知道使用类似 SQL 的声明式查询语言提供简单、快速的平面文件查询的工具?我宁愿不支付将文件加载到数据库中的开销,因为输入数据通常在查询运行后几乎立即被丢弃。

考虑数据文件“animals.txt”:

dog 15
cat 20
dog 10
cat 30
dog 5
cat 40

假设我想为每个独特的动物提取最高值。我想写一些类似的东西:

cat animals.txt | foo "select $1, max(convert($2 using decimal)) group by $1"

使用sort 可以得到几乎相同的结果:

cat animals.txt | sort -t " " -k1,1 -k2,2nr

而且我总是可以从那里进入awk,但是当类似 SQL 的语言似乎可以如此干净地解决问题时,这一切都感觉有点awkward(无法抗拒)。

我考虑过为 SQLite 编写一个包装器,它会根据输入数据自动创建一个表,并且我研究过在单处理器模式下使用 Hive,但我不禁觉得这个问题一直存在之前解决了。我错过了什么吗?此功能是否已由其他标准工具实现?

停下来!

【问题讨论】:

    标签: sql linux sorting flat-file


    【解决方案1】:

    我写TxtSushi 主要是为了对平面文件进行 SQL 选择。这是您示例的命令链(所有这些命令都来自 TxtSushi):

    tabtocsv 动物.txt |名称列 - | tssql -table 动物 - \
    'select col1, max(as_int(col2)) from animals group by col1'

    namecolumns 是必需的,因为 animals.txt 没有标题行。通过查看example scripts,您可以快速了解可能发生的事情。主页底部也有类似工具的链接。

    【讨论】:

    • 非常好。它的扩展性如何?我希望处理超过我机器上可用 RAM 的数 GB 文件。
    • 它使用流式方法执行任何类型的行过滤或列选择,但只要您要求它执行任何需要排序的操作(分组、加入、按所有要求排序),它就会想要将整个表读入内存。在这种情况下,您可以提供 -external-sort 选项,它告诉 TxtSushi 在磁盘上进行排序,但我当前的外部排序实现效率非常低,需要一些工作。
    【解决方案2】:

    使用DBD::AnyData的Perl DBI

    【讨论】:

      【解决方案3】:

      你可以使用 sqlite。这是一个使用 Python 的示例。

      import sqlite3
      conn = sqlite3.connect('/tmp/test.db')
      cursor = conn.cursor()
      try:
          cursor.execute("""create table table1 (word varchar not null, number varchar not null)""")
      except: pass
      cursor.execute("insert into table1 values ('dog', '15')")
      cursor.execute("insert into table1 values ('cat', '20')")
      cursor.execute("insert into table1 values ('dog', '10')")
      cursor.execute("select max(number) , word from table1 group by word")
      print cursor.fetchall()
      

      输出

      $ ./python.py
      [(u'20', u'cat'), (u'15', u'dog')]
      

      【讨论】:

      • 我希望能够直接从 shell 做所有事情,这个解决方案似乎不支持。
      【解决方案4】:

      我只是偶然发现了this Python script,它可以执行您想要的操作,尽管它只支持非常基本的查询。

      【讨论】:

        【解决方案5】:

        我们将有一个lightweight ORM for sqlite,它将简化此任务,而无需任何配置文件等。

        如果可以的话,PowerShell 有很多强大的功能来解析和查询文本文件 (example here)。否则,您可以使用 .NET/Mono 将其切入并立即使用 LINQ。

        【讨论】:

        • 我希望能够直接从 shell 做所有事情,这个解决方案似乎不支持。
        • 哪一个? Powershell 是类固醇上的 bash,它可以让你从 shell 做任何事情。至于 OrmLite(这是我会使用的),您编写几行程序将所有数据导入您选择的数据库,然后您可以使用 sqlite3.exe 从命令提示符查询。
        【解决方案6】:

        我从来没有为我的问题找到令人满意的答案,但我至少找到了一个解决我的玩具问题的方法,使用 uniqs "-f" 选项,这是我不知道的:

        cat animals.txt | sort -t " " -k1,1 -k2,2nr \
        | awk -F' ' '{print $2, " ", $1}' | uniq -f 1
        

        如果输入文件是用相反顺序的列创建的,显然可以完全跳过上面的 awk 部分。

        不过,我仍然对类似 SQL 的工具抱有希望。

        【讨论】:

          【解决方案7】:

          我制作了一个可能会有所帮助的工具。 http://www.mccoyonlinestore.com/index.php?txtSearch=mccoy_rdbms 您的 sql 可能是“从动物中选择最大值(值)” 或者它可以通过“从动物中按价值顺序选择*”

          【讨论】:

            【解决方案8】:

            您可以查找HXTT JDBC Drivers。它们为大多数类型的平面文件、excel 等提供 JDBC 驱动程序。

            您可以对其执行简单的 SQL 查询。

            他们也有试用版

            【讨论】:

              猜你喜欢
              • 2022-11-29
              • 2013-08-31
              • 1970-01-01
              • 2017-01-15
              • 2015-12-09
              • 1970-01-01
              • 2011-01-09
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多