#apache-spark #classnotfoundexception #apache-zeppelin
#apache-spark #исключение classnotfoundexception #apache-zeppelin
Вопрос:
У меня проблема уже два дня, и я не могу найти никаких решений.
Я получаю
ClassNotFoundException: org.apache.zeppelin.spark.ZeppelinContext
при использовании входного значения внутри метода фильтрации фрейма данных spark.
val city = z.select("City",cities).toString
oDF.select("city").filter(r => city.equals(r.getAs[String]("city"))).count()
Я даже пытался скопировать входное значение в другой val с
new String(bytes[])
но все равно получаю ту же ошибку.
Тот же код работает без проблем, если вместо получения значения из z.select я объявляю как строковый литерал
city: String = "NY"
org.apache.spark.SparkException: Job aborted due to stage failure: Task 0
in stage 49.0 failed 4 times, most recent failure: Lost task 0.3 in stage
49.0 (TID 277, 10.6.60.217): java.lang.NoClassDefFoundError:
Lorg/apache/zeppelin/spark/ZeppelinContext;
Комментарии:
1. Первая строка выполнена успешно, поскольку городу уже присвоено значение «NY». И класс
org.apache.zeppelin.spark.ZeppelinContext
обязательно должен быть упакован в Zeppelin. Я предполагаю, что вы работаете с внешним Spark, который, возможно, пользователь z определенным образом. Попробуйте разделить код на разные абзацы и запустить его.2. Да, я работаю с внешним Spark. Та же ошибка после разделения на два абзаца
Ответ №1:
Вы движетесь в неправильном направлении:
val city="NY"
выдает строку scala с NY в качестве строки, но когда вы говорите
z.select("City",cities)
затем это возвращает вам фрейм данных, а затем вы преобразуете этот объект в строку с помощью метода toString, а затем пытаетесь сравнить.!
Это не сработает!
Что вы можете сделать, это либо собрать один dF, а затем соответствующим образом передать строку scala в другой Df, либо вы можете выполнить объединение, если хотите сделать это для нескольких значений.
Но этот подход точно не сработает!
Комментарии:
1. переменная z не является фреймом данных. Является переменной контекста Zeppelin по умолчанию, следовательно, метод select не является методом select из фрейма данных Spark. Этот метод select возвращает объект, который преобразуется в строку с помощью toString.
2. Если вы получаете значение после применения toString, можете ли вы его распечатать?
3. да, конечно, я могу его распечатать. Проблема заключается в том, что переменная используется внутри метода фильтра фрейма данных. Похоже, что он был недавно вычислен вне драйвера Spark и на удаленном узле, где нет org.apache.zeppelin.spark.ZeppelinContext. Zeppelin использует локальный драйвер и отправляет приложение в кластер Spark