Apache Pig UDF: Phần 2 - Chức năng tải



Bài đăng này mô tả về Apache Pig UDF - Load Functions. (Apache Pig UDF: Phần 2). Hãy xem các chức năng tải của Apache Pig UDF.

Bài đăng hôm nay nói về các chức năng Tải trong Apache Pig. Đây là phần tiếp theo của bài viết đầu tiên bao gồm các chức năng của UDF như Đánh giá, Lọc và Tổng hợp. Vui lòng refter chúng để biết thêm thông tin về các chức năng khác của Pig UDF.





các loại bộ lọc trong hoạt cảnh

Chức năng tải của Pig được xây dựng trên đầu vào của Hadoop’s InputFormat, lớp mà Hadoop sử dụng để đọc dữ liệu. InputFormat có hai mục đích: Nó xác định cách thức đầu vào sẽ được phân mảnh giữa các tác vụ bản đồ và cung cấp một RecordReader dẫn đến các cặp khóa-giá trị làm đầu vào cho các tác vụ bản đồ đó. Lớp cơ sở cho hàm tải là LoadFunc.

Chức năng tải - Phân loại:

Lớp trừu tượng LoadFunc có ba phương thức chính để tải dữ liệu và trong hầu hết các trường hợp sử dụng, chỉ cần mở rộng nó là đủ. Có ba giao diện tùy chọn khác có thể được triển khai để đạt được chức năng mở rộng:



  • LoadMetadata:

LoadMetadata có các phương pháp xử lý siêu dữ liệu. Hầu hết quá trình thực thi của trình tải không cần triển khai điều này trừ khi chúng tương tác với hệ thống siêu dữ liệu. Phương thức getSchema () trong giao diện này cung cấp một cách để triển khai trình tải truyền thông về lược đồ dữ liệu trở lại Pig. Nếu một triển khai trình tải trả về dữ liệu bao gồm các trường thuộc kiểu thực, nó sẽ cung cấp lược đồ mô tả dữ liệu được trả về thông qua phương thức getSchema (). Các phương pháp khác xử lý các loại siêu dữ liệu khác như khóa phân vùng và thống kê. Việc triển khai có thể trả về giá trị trả về null cho các phương thức này nếu chúng không hợp lệ cho việc triển khai khác.

  • LoadPushDown:

LoadPushDown có các phương pháp khác nhau để đẩy các hoạt động từ thời gian chạy Pig vào việc triển khai trình tải. Hiện tại, chỉ có phương thức pushProjection () được gọi bởi Pig để giao tiếp với trình tải, các trường chính xác được yêu cầu trong tập lệnh Pig. Việc triển khai trình nạp có thể chọn tuân theo hoặc không tuân theo yêu cầu. Nếu việc triển khai trình tải quyết định tuân theo yêu cầu, nó sẽ triển khai LoadPushDown để cải thiện hiệu suất truy vấn.

  • pushProjection ():

Phương thức này thông báo cho LoadFunc, những trường nào được yêu cầu trong tập lệnh Pig. Do đó cho phép LoadFunc nâng cao hiệu suất bằng cách chỉ tải các trường được yêu cầu. pushProjection () nhận một ‘RequiredFieldList.’ ‘requiredFieldList’ chỉ được đọc và không thể thay đổi bởi LoadFunc. 'RequiredFieldList' bao gồm một danh sách các 'RequiredField', trong đó mỗi 'requiredField' chỉ ra một trường được yêu cầu bởi tập lệnh Pig và bao gồm chỉ mục, bí danh, loại và các trường con. Pig sử dụng chỉ mục cột RequiredField.index để giao tiếp với LoadFunc về các trường được yêu cầu bởi tập lệnh Pig. Nếu trường bắt buộc là một bản đồ, Pig sẽ chuyển ‘requiredField.subFields’ chứa danh sách các khóa theo yêu cầu của tập lệnh Pig cho bản đồ.



mệnh đề liên hiệp được sử dụng để
  • LoadCaster:

LoadCaster có các kỹ thuật để chuyển đổi mảng byte thành các kiểu cụ thể. Việc triển khai trình nạp sẽ thực hiện điều này khi các kiểu truyền ngầm hoặc rõ ràng từ các trường DataByteArray sang các kiểu khác cần được hỗ trợ.

Lớp trừu tượng LoadFunc là lớp chính để mở rộng để triển khai một trình nạp. Các phương thức được yêu cầu ghi đè được giải thích bên dưới:

  • getInputFormat ():

    Phương thức này được gọi bởi Pig để lấy InputFormat được sử dụng bởi bộ tải. Các phương thức trong InputFormat được Pig gọi theo cùng kiểu với Hadoop trong chương trình MapReduce Java. Nếu InputFormat là một Hadoop được đóng gói, thì việc triển khai phải sử dụng API mới dựa trên cơ sở org.apache.hadoop.mapreduce. Nếu đó là InputFormat tùy chỉnh, thì tốt hơn nên được triển khai bằng API mới trong org.apache.hadoop.mapreduce.

  • thiết lập địa điểm():

    Phương thức này được gọi bởi Pig để thông báo vị trí tải cho bộ nạp. Bộ nạp cần sử dụng phương pháp này để truyền thông tin tương tự tới InputFormat cốt lõi. Phương pháp này được gọi là nhiều lần bởi heo.

  • chuẩn bịToRead ():

    Trong phương pháp này, RecordReader liên quan đến InputFormat do LoadFunc cung cấp sẽ được chuyển tới LoadFunc. RecordReader hiện có thể được sử dụng bởi quá trình triển khai trong getNext () để trả về một bộ giá trị đại diện cho một bản ghi dữ liệu trở lại Pig.

  • getNext ():

    Ý nghĩa của getNext () không thay đổi và được gọi bởi Pig runtime để thu thập bộ tiếp theo trong dữ liệu. Trong phương pháp này, việc triển khai phải sử dụng RecordReader bên dưới và xây dựng bộ tuple để trả về.

Triển khai mặc định trong LoadFunc:

Lưu ý rằng các triển khai mặc định trong LoadFunc chỉ nên được ghi đè khi cần thiết.

  • setUdfContextSignature ():

    Phương thức này sẽ được gọi bởi Pig, ở cả front end và back end để chuyển một chữ ký duy nhất cho Trình tải. Chữ ký có thể được sử dụng để lưu trữ bất kỳ thông tin nào vào UDFContext mà Trình tải cần lưu trữ giữa các lệnh gọi phương thức khác nhau trong giao diện người dùng và kết thúc phía sau. Trường hợp sử dụng là lưu trữ RequiredFieldList được chuyển đến nó trong LoadPushDown.pushProjection (RequiredFieldList) để sử dụng ở phần cuối trước khi trả về các bộ giá trị trong getNext (). Việc triển khai mặc định trong LoadFunc có phần thân trống. Phương thức này sẽ được gọi trước các phương thức khác.

  • tương đốiToAbsolutePath ():

    Pig runtime sẽ gọi phương thức này để cho phép Trình tải chuyển đổi vị trí tải tương đối thành vị trí tuyệt đối. Việc triển khai mặc định được cung cấp trong LoadFunc xử lý điều này cho các vị trí FileSystem. Nếu nguồn tải là thứ khác, triển khai trình tải có thể chọn ghi đè điều này.

Triển khai trình tải trong ví dụ là trình tải cho dữ liệu văn bản với dấu phân cách dòng là ‘
‘Và‘ ‘làm dấu phân cách trường mặc định tương tự như trình tải PigStorage hiện tại trong Pig. Việc triển khai sử dụng Định dạng đầu vào được hỗ trợ Hadoop hiện có - TextInputFormat - làm InputFormat cơ bản.

public class SimpleTextLoader mở rộng LoadFunc {protected RecordReader in = null private byte fieldDel = '' private ArrayList mProtoTuple = null private TupleFactory mTupleFactory = TupleFactory.getInstance () private static final int BUFFER_SIZE = 1024 public SimpleTextLoader * Construct} Trình tải lợn sử dụng ký tự được chỉ định làm dấu phân cách trường. * * Dấu phân cách @param * ký tự byte đơn được sử dụng để phân tách các trường. * ('' là mặc định.) * / public SimpleTextLoader (String delimiter) {this () if (delimiter.length () == 1) {this.fieldDel = (byte) delimiter.charAt (0)} else if ( delimiter.length ()> 1 & & delimiter.charAt (0) == '') {switch (delimiter.charAt (1)) {case 't': this.fieldDel = (byte) '' break case 'x' : fieldDel = Integer.valueOf (delimiter.substring (2), 16) .byteValue () break case 'u': this.fieldDel = Integer.valueOf (delimiter.substring (2)). byteValue () break default: ném mới RuntimeException ('Dấu phân cách không xác định' + dấu phân tách)}} else {ném mới RuntimeException ('Độ phân giải PigStorage phải là một ký tự duy nhất')}} @Override public Tuple getNext () ném IOException {try {boolean notDone = in.nextKeyValue () if (notDone) {return null} Giá trị văn bản = (Văn bản) in.getCurrentValue () byte [] buf = value.getBytes () int len ​​= value.getLength () int start = 0 for (int i = 0 iCó một câu hỏi cho chúng tôi? Vui lòng đề cập đến nó trong phần bình luận và chúng tôi sẽ liên hệ lại với bạn. 

Bài viết liên quan:

hàm trong sql là gì