【问题标题】:Replacing an SQL query with unix sort, uniq and awk用 unix sort、uniq 和 awk 替换 SQL 查询
【发布时间】:2011-10-27 11:49:51
【问题描述】:

我们目前在 HDFS 集群上拥有一些数据,我们使用 Hive 在其上生成报告。基础设施正在退役,我们的任务是提出生成数据报告的替代方案(我们将其作为制表符分隔的文件导入到我们的新环境中)

假设我们有一个包含以下字段的表。

  • 查询
  • IP 地址
  • 位置代码

我们过去在 Hive 上运行的原始 SQL 查询是(不完全是……但类似的东西)

select 
COUNT(DISTINCT Query, IPAddress) as c1,
LocationCode as c2, 
Query as c3
from table
group by Query, LocationCode

我想知道是否有人可以使用标准 unix/linux 工具(如 sort、uniq 和 awk)为我提供最有效的脚本,可以替代上述查询。

假设脚本的输入是一个文本文件目录。该目录将包含大约 2000 个文件。每个文件将包含任意数量的制表符分隔记录,格式为:

Query <TAB> LocationCode <TAB> IPAddress <NEWLINE>

【问题讨论】:

  • 每个文件大概有多少行?
  • @a'r 几千.. 它可能会有所不同。最大的文件大小约为 2MB,最小的约为 450KB
  • 您的原始查询看起来很奇怪,因为您正在按您也在聚合的字段之一进行分组,即您的不同计数可能只是 count(distinct IPAddress)。查询应该是这样的吗?
  • @a'r 是的.. 我猜你是礼仪。你真的不需要在那里包含查询..
  • 目录下的2000个文件,是否可以包含相同的Query/LocationCode/IPAddress元组?

标签: sql sorting awk hive uniq


【解决方案1】:

一旦你有一个包含所有唯一的排序文件

Query <TAB> LocationCode <TAB> IPAddress <NEWLINE>

你可以:

awk -F '\t' 'NR == 1 {q=$1; l=$2; count=0}
q == $1 && l == $2{count++}
q != $1 || l != $2{printf "%s\t%s\t%d\n", q, l, count; q=$1; l=$2; count=1}
END{printf "%s\t%s\t%d\n", q, l, count}' sorted_uniq_file

要得到这个sorted_uniq_file,天真的方法可以是:

sort -u dir/* > sorted_uniq_file

但这可能会很长而且很耗内存。

更快的选择(和更少的内存消耗)可能是尽快消除重复,先排序,然后合并。这需要一个临时空间来存放排序文件,让我们使用一个名为sorted的目录:

mkdir sorted;
for f in dir/*; do
   sort -u $f > sorted/$f
done
sort -mu sorted/* > sorted_uniq_file
rm -rf sorted

如果上述解决方案达到了某个 shell 或排序限制(dir/*sorted/* 的扩展,或 sort 的参数数量):

mkdir sorted;
ls dir | while read f; do
   sort -u dir/$f > sorted/$f
done
while [ `ls sorted | wc -l` -gt 1 ]; do
  mkdir sorted_tmp
  ls sorted | while read f1; do
    if read f2; then
      sort -mu sorted/$f1 sorted/$f2 > sorted_tmp/$f1
    else
      mv sorted/$f1 sorted_tmp
    fi
  done
  rm -rf sorted
  mv sorted_tmp sorted
done
mv sorted/* sorted_uniq_file
rm -rf sorted

上面的解决方案可以优化为同时合并两个以上的文件。

【讨论】:

    【解决方案2】:

    不是您原始问题的直接答案(您已经得到了),但如果您有一堆平面文件数据要以不同方式查询,您可以考虑使用NoSQL

    http://www.strozzi.it/cgi-bin/CSA/tw7/I/en_US/nosql/Home%20Page

    这个 NoSQL 项目与最近被称为“NoSQL 数据库”的项目(并且早很多年)完全不同。相反,这个 NoSQL 将 Unix 工具结合在一起,以 Awk 为核心,以简化它们在访问和维护格式化文本文件数据库时的使用。可以很容易地做很多漂亮的事情,例如,表连接。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-19
      • 2020-04-05
      • 2017-02-14
      • 2014-03-02
      • 2012-09-22
      • 2018-02-06
      • 1970-01-01
      相关资源
      最近更新 更多