2012-09-05 28 views
7

Tôi có các tệp có tên part-r-000 [0-9] [0-9] và chứa các trường được phân tách bằng tab. Tôi có thể xem chúng bằng cách sử dụng hadoop fs -text part-r-00000 nhưng không thể tải chúng bằng cách sử dụng lợn.Apache Pig: Tải một tệp hiển thị tốt bằng cách sử dụng hadoop fs -text

Những gì tôi đã cố gắng:

x = load 'part-r-00000'; 
dump x; 
x = load 'part-r-00000' using TextLoader(); 
dump x; 

nhưng điều đó chỉ mang lại cho tôi rác. Làm thế nào tôi có thể xem các tập tin bằng cách sử dụng lợn?

Điều gì có thể liên quan là hdfs của tôi vẫn đang sử dụng CDH-2 tại thời điểm này. Hơn nữa, nếu tôi tải tệp xuống địa phương và chạy file part-r-00000, hãy nói part-r-00000: data, tôi không biết cách giải nén tệp cục bộ.

+0

Tôi tin đầu tiên 'load' của bạn sử dụng PigStorage, nhưng có lẽ bạn có thể kiểm tra lại bằng cách rõ ràng, 'x = LOAD 'part-r-00000' SỬ DỤNG SỬ DỤNG PigStorage ('\ t')'. Khi bạn tải xuống tệp cục bộ, nếu bạn xem tệp đó (tức là 'đuôi'), nó có phải là rác/nhị phân không? Bạn có thể cho ví dụ về mã tạo dữ liệu này không? –

+0

Sử dụng PigStorage cho kết quả tương tự. Tải xuống địa phương (bằng cách sử dụng -get hoặc -copyToLocal) tệp không thể đọc được, i. e. nhị phân/rác (ít hoặc đuôi). Tôi sẽ cố tìm mã đã tạo các tệp này và báo cáo lại. – exic

+0

Dường như tệp đã được lưu trữ dưới dạng tệp chuỗi. Tôi đã có thể trích xuất các dòng từ nó bằng cách sử dụng chức năng tải do người dùng xác định. Có cách nào đơn giản hơn bằng cách sử dụng udf? – exic

Trả lời

4

Theo HDFS Documentation, hadoop fs -text <file> có thể được sử dụng trên dữ liệu "zip và TextRecordInputStream", do đó dữ liệu của bạn có thể thuộc một trong các định dạng này.

Nếu tệp được nén, thông thường Hadoop sẽ thêm phần mở rộng khi xuất ra HDFS, nhưng nếu thiếu, bạn có thể thử kiểm tra bằng cách giải nén/ungzipping/unbzip2ing/etc cục bộ. Có vẻ như Pig sẽ thực hiện việc giải nén này tự động, nhưng có thể yêu cầu phải có phần mở rộng của tệp (ví dụ: part-r-00000.zip) - more info.

Tôi không chắc chắn về TextRecordInputStream .. có vẻ như nó sẽ là phương pháp mặc định của Pig, nhưng tôi có thể sai. Tôi không thấy bất kỳ đề cập đến LOAD'ing dữ liệu này thông qua Pig khi tôi đã làm một Google nhanh chóng.

Cập nhật: Vì bạn đã phát hiện ra nó là một tập tin trình tự, dưới đây là cách bạn có thể tải nó bằng cách sử lợn tiết kiệm:

-- using Cloudera directory structure: 
REGISTER /usr/lib/pig/contrib/piggybank/java/piggybank.jar 
--REGISTER /home/hadoop/lib/pig/piggybank.jar 
DEFINE SequenceFileLoader org.apache.pig.piggybank.storage.SequenceFileLoader(); 


-- Sample job: grab counts of tweets by day 
A = LOAD 'mydir/part-r-000{00..99}' # not sure if pig likes the {00..99} syntax, but worth a shot 
    USING SequenceFileLoader AS (key:long, val:long, etc.); 
+1

'{00..99}' không hoạt động, vì vậy tôi chỉ đơn giản là sử dụng '*' thay thế.Sau đó, dòng có thể được đọc bằng cách sử dụng 'B = FOREACH A GENERATE flatten (STRSPLIT (val, '\ t')) AS (vv)', vì SequenceFileLoader chỉ trả về hai cột. – exic

3

Nếu bạn muốn thao tác (đọc/ghi) các tập tin liên tục với Pig thì bạn cũng có thể thử trên Twitter Elephant-Bird.

Bạn có thể tìm thấy here ví dụ về cách đọc/ghi chúng.

Nếu bạn sử dụng các tệp có thể tùy chỉnh trong tệp trình tự của bạn thì bạn có thể triển khai trình chuyển đổi tùy chỉnh bằng cách mở rộng AbstractWritableConverter.

Lưu ý rằng Elephant-Bird cần phải cài đặt Thrift trong máy của bạn. Trước khi xây dựng nó, hãy chắc chắn rằng nó được sử dụng phiên bản tiết kiệm đúng bạn có và cũng cung cấp đường dẫn đúng đắn về thực thi tiết kiệm trong nó pom.xml:

<plugin> 
    <groupId>org.apache.thrift.tools</groupId> 
    <artifactId>maven-thrift-plugin</artifactId> 
    <version>0.1.10</version> 
    <configuration> 
    <thriftExecutable>/path_to_thrift/thrift</thriftExecutable> 
    </configuration> 
</plugin> 
Các vấn đề liên quan