2016-03-05 15 views
5

Tôi đang cố gắng để chuyển đổi biểu thức này Scala Java:Chuyển đổi biểu Scala Java 1.8

val corpus: RDD[String] = sc.wholeTextFiles("docs/*.md").map(_._2) 

Đây là những gì tôi có trong Java:

RDD<String> corpus = sc.wholeTextFiles("docs/*.md").map(a -> a._2); 

Nhưng tôi nhận được một lỗi trên a._2 :.

Bad return type in lambda expression: String cannot be converted to R

Nếu tôi đi đến phương pháp "siêu", đây là những gì tôi thấy:

package org.apache.spark.api.java.function; 

import java.io.Serializable; 

public interface Function<T1, R> extends Serializable { 
     R call(T1 var1) throws Exception; 
} 

Trả lời

5

Trong Scala PairRDD là một loại tuple và bạn có thể truy cập các thành viên của nó với _1_2. Tuy nhiên Java không có sẵn trong Tuples nên bạn phải sử dụng các phương thức để có được những thành viên này. Nó sẽ giống như thế này, vì Java luôn yêu cầu dấu ngoặc đơn trên bất kỳ hàm nào.

JavaRDD<String> corpus = sc.wholeTextFiles("docs/*.md").map(a -> a._2()); 

Edit: Dường như trong Scala một tham số ngầm được truyền cho phương thức map, có nghĩa là bạn phải vượt qua nó một cách rõ ràng trong Java. Xem here cho Tài liệu Java và here cho tài liệu Scala.

Chỉnh sửa 2: Sau một vài giờ dò dẫm câu trả lời được tìm thấy, nó phải là một JavaRDD.

+0

tôi nhận được lỗi tương tự với điều này ... "Chuỗi không thể được chuyển đổi thành R" – neuromouse

+0

Bây giờ điều đó lạ, 'a' sẽ là kiểu scala.Tuple2 . Bạn có thể kiểm tra xem loại a có trong trường hợp của bạn không? –

+0

Điều này cho tôi cùng một lỗi: (Tuple2 a) -> a._2(). Nhưng nếu tôi bỏ qua các chuỗi: (Tuple2 a) -> a._2() - Tôi nhận được một lỗi khác: không thể giải quyết bản đồ phương thức () – neuromouse

2

Bạn sẽ có thể sử dụng values() để có được những kết quả mà bạn muốn trong Java ở đây:

JavaRDD<String> corpus = sc.wholeTextFiles("docs/*.md").values(); 

Lưu ý rằng loại ở đây là JavaRDD không RDD

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