Java - функция карты Spark SQL DataFrame не работает

В Spark SQL, когда я пытался использовать функцию карты в DataFrame, я получаю ошибку ниже.

Карта методов (Function1, ClassTag) в типе DataFrame неприменима для аргументов (new Function () {})

Я также слежу за документацией по Spark 1.3. https://spark.apache.org/docs/latest/sql-programming-guide.html#inferring-the-schema-using-reflection Есть ли какое-нибудь решение?

Вот мой тестовый код.

   // SQL can be run over RDDs that have been registered as tables.
DataFrame teenagers = sqlContext.sql("SELECT name FROM people WHERE age >= 13 AND age <= 19");

List<String> teenagerNames = teenagers.map(
            new Function<Row, String>() {
          public String call(Row row) {
            return "Name: " + row.getString(0);
          }
        }).collect();

person user3206330    schedule 22.04.2015    source источник
comment
не могли бы вы предоставить свой полный код? кстати, какую версию os SPARK вы используете? (›1.3.0)   -  person Fabio Fantoni    schedule 22.04.2015
comment
Я использую Spark 1.3.1 с Spark-sql 1.3.1   -  person user3206330    schedule 23.04.2015


Ответы (6)


Измените это на:

Java 6 и 7

List<String> teenagerNames = teenagers.javaRDD().map(
    new Function<Row, String>() {
    public String call(Row row) {
        return "Name: " + row.getString(0);
    }
}).collect();

Java 8

List<String> t2 = teenagers.javaRDD().map(
    row -> "Name: " + row.getString(0)
).collect();

После вызова javaRDD () он работает так же, как и любая другая функция карты RDD.

Это работает со Spark 1.3.0 и выше.

person econn    schedule 05.05.2015
comment
Что произойдет, если преобразовать его в СДР? Преобразование ленивое? Память перенесена в новую структуру? Можно ли еще оптимизировать выполнение? - person GiCo; 14.05.2016

Нет необходимости преобразовывать в RDD, это задерживает выполнение, это можно сделать, как показано ниже

`public static void mapMethod () {// Считываем данные из файла, в пути к которому файл находится. Набор данных df = sparkSession.read (). Json ("file1.json");

// Prior to java 1.8 
Encoder<String> encoder = Encoders.STRING();
    List<String> rowsList = df.map((new MapFunction<Row, String>() {
        private static final long serialVersionUID = 1L;

        @Override
        public String call(Row row) throws Exception {
            return "string:>" + row.getString(0).toString() + "<";
        }
    }), encoder).collectAsList();

// from java 1.8 onwards
List<String> rowsList1 = df.map((row -> "string >" + row.getString(0) + "<" ), encoder).collectAsList();
System.out.println(">>> " + rowsList);
System.out.println(">>> " + rowsList1);

}`

person Vijay Anantharamu    schedule 23.12.2017
comment
Какую версию Spark вы используете для этого? - person Amu; 06.02.2018

У вас есть правильный набор зависимостей в файле pom. Установите это и попробуйте

    <dependency>
        <groupId>org.apache.spark</groupId>
        <artifactId>spark-sql_2.10</artifactId>
        <version>1.3.1</version>
    </dependency>
person urug    schedule 22.04.2015
comment
Я использую указанные ниже зависимости с Java 1.7 [код] ‹dependency› ‹groupId› org.apache.spark ‹/groupId› ‹artifactId› spark-core_2.11 ‹/artifactId› ‹version› 1.3.1 ‹/version› ‹/ зависимость ›‹dependency› ‹groupId› org.apache.spark ‹/groupId› ‹artifactId› spark-sql_2.11 ‹/artifactId› ‹version› 1.3.1 ‹/version ‹›/dependency› [/ code] - person user3206330; 23.04.2015
comment
В документации говорится, что вы можете запускать все обычные функции JavaRDD для DataFrames, но здесь это не так. Мне удалось воспроизвести вашу проблему. map () класса DataFrame ожидает 2 аргумента. Можно явно преобразовать Dataframe в RDD как teenagers.javaRDD (), а затем применить карту. - person urug; 23.04.2015

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

// SQL can be run over RDDs that have been registered as tables.
DataFrame teenagers = sqlContext.sql("SELECT name FROM people WHERE age >= 13 AND age <= 19");

List<String> teenagerNames = teenagers.toJavaRDD().map(
        new Function<Row, String>() {
      public String call(Row row) {
        return "Name: " + row.getString(0);
      }
    }).collect();

вам нужно преобразовать свой DataFrame в javaRDD

person Yassine Jouini    schedule 04.06.2015

проверьте, правильно ли вы используете импорт для

Строка (import org.apache.spark.sql.Row) Удалите любой другой импорт, связанный с Row. В противном случае синтаксис ur правильный

person Swaminathan S    schedule 04.02.2016

Пожалуйста, проверьте данные вашего входного файла и ваш запрос sql фрейма данных то же самое, что и я, и когда я оглядываюсь на данные, чтобы они не соответствовали моему запросу. Вероятно, та же проблема, с которой вы столкнулись. toJavaRDD и JavaRDD работают.

person ankitbeohar90    schedule 12.04.2016