2016-09-28 35 views
5

Xin chào và cảm ơn trước.Cách trả lại các loại phức tạp bằng cách sử dụng các tia lửa UDF

Chương trình của tôi được viết bằng java và tôi không thể chuyển sang scala.

Tôi hiện đang làm việc với một DataFrame spark chiết xuất từ ​​một tập tin JSON sử dụng dòng sau:

DataFrame dff = sqlContext.read().json("filePath.son");

SQLContext và SparkContext được initialzied một cách chính xác và chạy một cách hoàn hảo.

Vấn đề là json tôi đang đọc từ có cấu trúc lồng nhau và tôi muốn xóa/xác minh dữ liệu bên trong mà không thay đổi lược đồ.

Một trong các cột của khung dữ liệu nói riêng có loại "GenericRowWithSchema".

Giả sử tôi muốn xóa cột duy nhất đó, có tên là "dữ liệu".

Giải pháp mà tôi nghĩ đến là định nghĩa một hàm do người dùng định nghĩa (UDF) có tên là "cleanDataField" và sau đó chạy nó trên cột "dữ liệu". Dưới đây là các mã:

UDF1<GenericRowWithSchema,GenericRowWithSchema> cleanDataField = new UDF1<GenericRowWithSchema, GenericRowWithSchema>(){ 

     public GenericRowWithSchema call(GenericRowWithSchema grws){ 

      cleanGenericRowWithSchema(grws); 

      return grws; 

     } 
    }; 

Sau đó, tôi sẽ đăng ký chức năng trong SQLContext:

sqlContext.udf().register("cleanDataField", cleanDataField, DataTypes.StringType); 

Và sau đó tôi sẽ gọi

df.selectExpr("cleanDataField(data)").show(10, false);

Để xem đầu tiên 10 các hàng có dữ liệu sạch.

Cuối cùng, câu hỏi dẫn đến kết quả này: Tôi có thể trả về dữ liệu phức tạp (chẳng hạn như đối tượng lớp tùy chỉnh) không? Và nếu có thể, tôi nên làm như thế nào? Tôi đoán tôi phải thay đổi tham số thứ 3 của udf đăng ký vì tôi không trả về một chuỗi, nhưng tôi nên thay thế nó để làm gì?

Cảm ơn bạn

Trả lời

1

Hãy nói rằng bạn muốn xây dựng một kiểu dữ liệu như struct<companyid:string,loyaltynum:int,totalprice:int,itemcount:int>

Đối với điều này bạn có thể làm như sau:

// I am just copying the json string as is but you will need to escape it properly for java. 

DataType dt = DataType.fromJson({"type":"struct","fields":[{"name":"companyid","type":"string","nullable":false,"metadata":{}},{"name":"loyaltynum","type":"integer","nullable":false,"metadata":{}},{"name":"totalprice","type":"integer","nullable":false,"metadata":{}},{"name":"itemcount","type":"integer","nullable":false,"metadata":{}}]}) 

Sau đó bạn có thể sử dụng kiểu dữ liệu như kiểu trả khi đăng ký UDF của bạn.

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