2012-11-11 48 views
10

Dữ liệu trông như thế này, trường đầu tiên là một con số,làm thế nào để sắp xếp số trong giai đoạn trộn/sắp xếp của Hadoop?

3 ... 
1 ... 
2 ... 
11 ... 

Và tôi muốn sắp xếp những dòng này theo trường đầu tiên số lượng thay vì theo thứ tự abc, có nghĩa là sau khi phân loại nó sẽ giống như thế này,

1 ... 
2 ... 
3 ... 
11 ... 

Nhưng hadoop giữ cho tôi này,

1 ... 
11 ... 
2 ... 
3 ... 

làm thế nào để sửa chữa nó?

Trả lời

20

Giả sử bạn đang sử dụng Hadoop Truyền, bạn cần phải sử dụng KeyFieldBasedComparator lớp.

  1. -D mapred.output.key.comparator.class = org.apache.hadoop.mapred.lib.KeyFieldBasedComparator nên được thêm vào lệnh trực tuyến

  2. Bạn cần cung cấp loại phân loại yêu cầu sử dụng mapred.text.key.comparator.options. Một số những người hữu ích là -n: sắp xếp số, -r: đảo ngược loại

VÍ DỤ:

Tạo một mapper sắc và giảm tốc với đoạn mã sau

Đây là mapper. py & reducer.py

#!/usr/bin/env python 
import sys 
for line in sys.stdin:  
    print "%s" % (line.strip()) 

Đây là đầu vào .txt

1 
11 
2 
20 
7 
3 
40 

Đây là streaming lệnh

$HADOOP_HOME/bin/hadoop jar $HADOOP_HOME/hadoop-streaming.jar 
-D mapred.output.key.comparator.class=org.apache.hadoop.mapred.lib.KeyFieldBasedComparator 
-D mapred.text.key.comparator.options=-n 
-input /user/input.txt 
-output /user/output.txt 
-file ~/mapper.py 
-mapper ~/mapper.py 
-file ~/reducer.py 
-reducer ~/reducer.py 

Và bạn sẽ nhận được đầu ra cần

1 
2 
3 
7 
11 
20 
40 

LƯU Ý:

  1. Tôi đã sử dụng một đầu vào một phím đơn giản. Tuy nhiên, nếu bạn có nhiều khóa và/hoặc phân vùng, bạn sẽ phải chỉnh sửa mapred.text.key.comparator.options nếu cần. Vì tôi không biết trường hợp sử dụng của bạn, ví dụ của tôi bị giới hạn ở số

  2. Trình vẽ bản sắc này là cần thiết vì bạn sẽ cần ít nhất một người lập bản đồ cho công việc MR để chạy.

  3. Trình giảm nhận dạng là cần thiết vì giai đoạn trộn/sắp xếp sẽ không hoạt động nếu đó là công việc thuần túy chỉ có bản đồ.

+2

Cảm ơn bạn rất nhiều vì ví dụ mã – Alcott

+2

là có thể thay đổi thứ tự sắp xếp không? – masu

7

Trình so sánh mặc định của Hadoop so sánh các khóa của bạn dựa trên loại Writable (chính xác hơn WritableComparable) mà bạn sử dụng. Nếu bạn đang xử lý IntWritable hoặc LongWritable thì nó sẽ sắp xếp chúng số.

Tôi giả sử bạn đang sử dụng Text trong ví dụ của bạn do đó bạn sẽ kết thúc có thứ tự sắp xếp tự nhiên.

Trong trường hợp đặc biệt, bạn cũng có thể viết trình so sánh của riêng mình.
Ví dụ: cho mục đích thử nghiệm chỉ, đây là một ví dụ nhanh chóng làm thế nào để thay đổi thứ tự sắp xếp các phím chữ: điều này sẽ đối xử với họ như số nguyên và sẽ tạo ra số thứ tự sắp xếp:

public class MyComparator extends WritableComparator { 

     public MyComparator() { 
      super(Text.class); 
     } 

     @Override 
     public int compare(byte[] b1, int s1, int l1, byte[] b2, int s2, int l2) { 

      try { 

       String v1 = Text.decode(b1, s1, l1); 
       String v2 = Text.decode(b2, s2, l2); 

       int v1Int = Integer.valueOf(v1.trim()); 
       int v2Int = Integer.valueOf(v2.trim()); 

       return (v1Int < v2Int) ? -1 : ((v1Int > v2Int) ? 1 : 0); 

      } 
      catch (IOException e) { 
       throw new IllegalArgumentException(e); 
      } 
     } 
    } 

Trong bộ lớp jobrunner :

Job job = new Job(); 
... 
job.setSortComparatorClass(MyComparator.class); 
+0

Cảm ơn, nhưng tôi không viết 'java'. – Alcott

+0

@Alcott: cho 'Hadoop-streaming' tham chiếu đến điều này: http://hadoop.apache.org/docs/r1.0.4/streaming.html#Hadoop+Comparator+Class –

Các vấn đề liên quan