Как создать ClassTag для сопоставления Spark SQL DataFrame?

Запросы Spark SQL 1.2.0 возвращают JavaRDD. Запросы Spark SQL 1.3.0 возвращают DataFrame. Преобразование DataFrame в JavaRDD с помощью DataFrame.toJavaRDD, похоже, занимает довольно много времени. Я попытался использовать DataFrame.map() и столкнулся с загадочной проблемой:

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

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


    }, ?); 

"?" должно быть scala.reflect.ClassTag. Я использовал ClassManifestFactory.fromClass(String.class), и это не сработало. Что я должен поставить в "?".

Кстати, пример, приведенный http://spark.apache.org/docs/1.3.0/sql-programming-guide.html, раздел Взаимодействие с RDD. Код Java не исправлен: он использовал "map(new Function() {" "Функция" там не приемлема, должна быть "Функция1".


person Paul Z Wu    schedule 16.03.2015    source источник
comment
Это проблема с Java 8 для Spark, которая зависит от EsotericSoftware/reflectasm (в настоящее время поддерживает только Java 7): issues.apache.org/jira/browse/SPARK-6152.   -  person Paul Z Wu    schedule 16.03.2015


Ответы (3)


Попробуй это:

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));
person Sivanand Sivaram    schedule 13.04.2015

попробуйте это: (сработало для меня)

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

@Override
public String call(Row t1) {
    return t1.getString(0);
}
});
person Yassine Jouini    schedule 03.06.2015

Попробуй это:

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

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

}, ClassManifestFactory$.MODULE$.fromClass(String.class)); 
person Ali Khanafer    schedule 08.04.2015