Исключение ClassNotFoundException: org.apache.zeppelin.spark.ZeppelinContext при использовании входного значения Zeppelin внутри метода фильтра spark DataFrame в spark DataFrame

#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