1

現在、Hive を使用してレポートを生成する HDFS クラスターにいくつかのデータがあります。インフラストラクチャは廃止される過程にあり、データに関するレポートを生成する代替手段を考え出すタスクが残されています (タブ区切りファイルとして新しい環境にインポートしました)。

次のフィールドを持つテーブルがあるとします。

  • クエリ
  • IPアドレス
  • ロケーションコード

Hive で実行していた元の SQL クエリは (正確ではありませんが、似たようなものでした)。

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

上記のクエリの代わりとして機能する、sort、uniq、awk などの標準の UNIX/Linux ツールを使用して、最も効率的なスクリプトを誰かが提供してくれるかどうか疑問に思っていました。

スクリプトへの入力がテキスト ファイルのディレクトリであると仮定します。ディレクトリには約2000個のファイルが含まれます。各ファイルには、次の形式の任意の数のタブ区切りレコードが含まれます。

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

2 に答える 2

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

上記の解決策がシェルまたはソートの制限に達した場合 ( 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 つ以上のファイルをマージするように最適化できます。

于 2011-08-15T19:59:45.500 に答える
1

元の質問 (既に取得済み) に対する直接的な回答ではありませんが、さまざまな方法でクエリを実行するフラット ファイル データが多数ある場合は、次の使用を検討してNoSQLください。

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

この NoSQL プロジェクトは、最近「NoSQL データベース」として知られるようになったものとはまったく異なる (そして何年も前から存在する) ものです。代わりに、この NoSQL は、Awk を中心に Unix ツールを結び付けて、書式設定されたテキスト ファイルのデータベースへのアクセスと管理を簡素化します。テーブルの結合など、多くの洗練された処理を簡単に実行できます。

于 2011-08-26T23:58:10.403 に答える