2015-03-16 15 views
5

Truy vấn Spark SQL 1.2.0 trả về JavaRDD. Các truy vấn Spark SQL 1.3.0 trả về DataFrame. Chuyển đổi DataFrame sang JavaRDD bởi DataFrame.toJavaRDD có vẻ mất khá nhiều thời gian. Tôi đã cố gắng sử dụng DataFrame.map() và gặp vấn đề khó hiểu:Làm thế nào để xây dựng ClassTag cho Spark SQL DataFrame Mapping?

DataFrame df = sqlSC.sql(sql); 
RDD<String> rdd = df.map(new AbstractFunction1<Row, String>(){ 

     @Override 
     public String apply(Row t1) { 
      return t1.getString(0); 
     } 


    }, ?); 

"?" nên là scala.reflect.ClassTag. Tôi đã sử dụng ClassManifestFactory.fromClass (String.class) và nó không hoạt động. Tôi nên đặt gì ở "?"

Bằng cách này, ví dụ do http://spark.apache.org/docs/1.3.0/sql-programming-guide.html 's interoperating với RDDs phần Java Mã không được khắc phục: Đó là sử dụng 'bản đồ (Chức năng mới() {' The 'Chức năng' là không thể chấp nhận được ở đó Nó nên.. là "Function1"

+0

Đây là một vấn đề với Java 8 cho Spark mà phụ thuộc vào EsotericSoftware/reflectasm (Hiện tại chỉ hỗ trợ Java 7) : https://issues.apache.org/jira/browse/SPARK-6152. –

Trả lời

0

Hãy thử điều này:.

RDD<String> rdd = df.map(new AbstractFunction1<Row, String>(){ 

    @Override 
    public String apply(Row t1) { 
     return t1.getString(0); 
    } 

}, ClassManifestFactory$.MODULE$.fromClass(String.class)); 
5

Hãy thử điều này:

RDD<String> rdd = df.map(new AbstractFunction1<Row, String>(){ 

    @Override 
    public String apply(Row t1) { 
     return t1.getString(0); 
    } 


}, scala.reflect.ClassManifestFactory.fromClass(String.class)); 
1

thử điều này: (làm việc cho tôi)

RDD<String> rdd = df.toJavaRDD().map(new Function<Row, String>(){ 

@Override 
public String call(Row t1) { 
    return t1.getString(0); 
} 
}); 
Các vấn đề liên quan