就是 现在有一个log 里面全都是访问者的ip(数据很大很大) 一行一个ip
比如
123.22.22.187
123.22.22.182
123.22.21.187
123.22.42.187
123.23.22.187
123.22.22.182
121.22.22.182
....
怎么查出来访问次数最多的10个IP?
方式:
第一步:
如下读取:
声明一个变量 dictionary <string ,long> record
123.22.22.187
123.22.22.182
123.22.21.187
123.22.42.187
123.23.22.187
123.22.22.182
121.22.22.182
先与蓝色部分为key ,key 出现的次数为value 存在 record中。
这样 ,record的最大个数是255个,不算多,更说不上要多少内存。
再来一次大扫除,
使record 剩下 最多的 10 个元素
以这10 个元素为条件,再扫描一次表,把符合条件的数据写到另一个[文件A]中,
第二步:
扫描 [文件A] 以下面数据蓝色部分为key ,以出现次数为value 写到 变量 dictionary <string ,long> record 中
123.22.22.187
123.22.22.182
123.22.21.187
123.22.42.187
123.23.22.187
123.22.22.182
121.22.22.182
。。。
第三步:
。。。
第四步:
。。。
就这样,
用4 步相同的方法,提出最多的数据:10条,
问题,上面这种方式感觉不行啊,是我没理解吗??
比如说:
123,125,196,158,假设这个ip地址出现的次数最多,那么如下,
121,123
121,14
121,56
123,125,196,158,
123,125,196,158,
如果分段比较次数,那么123,125,196,158, 这个ip在第一步就被淘汰了?
Jawapan yang betul ialah ini: sort|uniq -c
a.b.c.d
Proses yang pertama.
Semua fail dibahagikan kepada berbilang bacaan (seperti 255 kali).
Rekod kemudiannya disimpan dalam 255 fail, sepadan dengan (seperti 1.b.c.d; 2.b.c.d;)
Dengan cara ini anda boleh mendapatkan sepuluh yang terbesar.
Seterusnya, berurusan dengan b.
. . .
Akhirnya dapat jawapannya.
Masalah jenis ini boleh menggunakan timbunan maksimum min.
Idea asas
对所有的ip进行分组,统计出现次数,ip做key,出现次数做val,保存在关联数组中
数组按照键值(出现次数)降序排序,取出前 10 条记录
Walaupun bukan
java语言描述的
,javascript描述
harus difahami, saya telah mengujinya dan ia boleh mencapai kesan anda:Berikut ialah contoh kod lengkap:
mengurangkan peta atau mengisih | uniq -c
Jelas sekali menggunakan hadoop (mengurangkan peta)?
Isih dahulu, ia akan lebih mudah untuk ditangani selepas menyusun.
Soalan ini harus dipecahkan kepada dua bahagian untuk memahami,
1 Fail sangat besar dan kecekapan membaca adalah rendah
2. Cari 10 rekod teratas dengan kejadian terbanyak
Soalan 1: Untuk bacaan fail besar boleh menggunakan pelaksanaan java AIO untuk membaca fail secara tidak segerak
Soalan 2: LindedList perlu dilanjutkan Setiap kali rekod dilampirkan, semak dahulu sama ada terdapat rekod, dan jika ya, tolak kedudukan rekod ke hadapan (. ini lebih serupa dengan algoritma caching memcached java)
Masalah jenis ini semuanya mempunyai idea yang sama, "pecah dan takluk".
Setiap IP adalah bersamaan dengan nombor integer 32-bit Lintas semua IP dalam log, bahagikannya kepada n fail mengikut julat nilai dan simpannya (pastikan setiap fail cukup kecil). IP yang sama pasti akan dibahagikan kepada fail yang sama, kemudian memproses n fail ini satu demi satu, dan mengira 10 IP teratas yang muncul dalam setiap fail akhirnya, dapatkan 10 teratas daripada 10*n IP ini.
Gunakan ungkapan biasa untuk menentukan nombor pertama pada permulaan IP:
IP yang paling kerap ialah nombor pada permulaan baris