2012-11-12 25 views
8

Lược đồ đầu ra là gì để trả về một từ điển từ Python UDF khi sử dụng Apache PIG.Cách: Lược đồ trả về từ điển UDF của Python trong PIG

Tôi có một cuốn từ điển của từ điển, một cái gì đó như thế này:

dict = {x:{a:1,b:2,c:3}, y:{d:1,e:3,f:9}} 

và schema đầu ra của tôi trông giống như

@outputSchema("m:map[im:map[X:float,Y:float]]") 

dấu ngoặc vuông ** bởi vì trong Pig chúng tôi sử dụng [] cho bản đồ mà điều này từ điển được chuyển đổi thành.

Trả lời

3

Nếu bạn đang sử dụng UDFs Jython tiêu chuẩn và không bất kỳ phân phối khác như streaming_python cung cấp bởi dữ liệu vữa, tất cả các bạn cần làm là:

@outputSchema('m:map[]') 

Các phím sẽ là tương tự mà bạn đã thiết lập trong python. Nếu bạn có một bộ từ điển trong dict của bạn, bạn không nên lo lắng về điều đó, lợn sẽ hiểu nó và sử dụng cú pháp như sau:

([first#{third=inner_dict},first#outter_dict]) 

Có một bất lợi lớn về truyền dict trở lại lợn từ một UDF Jython, bạn có chỉ có thể đặt một kiểu dữ liệu cho tất cả các giá trị trong dict, có nghĩa là nếu bạn không đặt bất kỳ kiểu dữ liệu nào, lợn sẽ sử dụng bytearray làm kiểu dữ liệu và đây có thể là vấn đề khi làm việc với ngày tháng hoặc cấu trúc phức tạp. Ví dụ:

@outputSchema('m:map[chararray]') 

Tuples và Túi xách:

Khi bạn muốn trả về một tuple hoặc một chiếc túi trở lại lợn từ một UDFs Jython nó rất hữu ích để nhớ danh sách của python mà chuyển sang túi xách và các bộ để tuples . Ví dụ:

Danh sách:

@outputSchema('m:bag{chararray}') 

Hãy nhớ rằng túi lợn được làm đầy với các bộ, vì vậy nếu bạn muốn thiết lập một cấu trúc tốt đẹp cho túi xách của bạn, bạn có thể khai báo một tuple trong túi, và có bạn sẽ có thể đặt tất cả các kiểu dữ liệu bạn sẽ chuyển. Ví dụ:

@outputSchema('map_reduce:bag{t:(key:chararray,value:int,start_date:datetime,end_date:datetime)}') 

Cuối cùng, tuples nên bằng cách nào đó trực quan, chúng là cấu trúc dễ sử dụng nhất khi sử dụng jython. Trong một bộ dữ liệu, bạn có thể đặt bao nhiêu trường mà bạn muốn và bao nhiêu cấp độ tùy thích, miễn là bạn làm theo các ví dụ trên. Bạn nên sử dụng Java UDF khi cố gắng thực hiện các thao tác phức tạp hoặc làm việc với các kiểu dữ liệu phức tạp như cấu trúc JSON, mảng và danh sách. Đường cong học tập có thể dốc hơn một chút, nhưng một khi bạn đã vượt qua điều đó, sự phát triển của bạn sẽ nhanh hơn nhiều và cũng là thông lượng của chương trình của bạn.

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