Почему я не могу прочитать эти кадры - PullRequest
0 голосов
/ 10 января 2019

У меня проблемы с чтением нескольких фреймов данных. У меня есть эта функция

def readDF(hdfsPath:String, more arguments): DataFrame = {//function goes here}

он принимает путь hdfs для раздела и возвращает фрейм данных (в основном он использует spark.read.parquet, но я должен его использовать). Я пытаюсь прочитать несколько из них, используя show partitions следующим образом:

val dfs = spark.sql("show partitions table")
.where(col("partition").contains(someFilterCriteria))
.map(partition => {
  val hdfsPath = s"hdfs/path/to/table/$partition"
  readDF(hdfsPath)
}).reduce(_.union(_))

но это дает мне эту ошибку

org.apache.spark.SparkException: Job aborted due to stage failure: Task 12 in stage 3.0 failed 4 times, most recent failure: Lost task 12.3 in stage 3.0 (TID 44, csmlcsworki0021.unix.aacc.corp, executor 1): java.lang.NullPointerException

Я думаю, это потому, что я выполняю spark.read.parquet внутри операции map для фрейма данных, потому что, если я изменю свой код для этого

val dfs = spark.sql("show partitions table")
.where(col("partition").contains(someFilterCriteria))
.map(row=> row.getString(0))
.collect
.toSeq
.map(partition => {
  val hdfsPath = s"hdfs/path/to/table/$partition"
  readDF(hdfsPath)
}).reduce(_.union(_))

правильно загружает данные. Однако я не хочу использовать collect, если это возможно. Как можно достичь моей цели?

1 Ответ

0 голосов
/ 10 января 2019

readDF создает фрейм данных из файлов паркета в HDFS. Это должно быть выполнено на стороне водителя. Первая версия, в которой вы выполняете, используя функцию map над строками исходного кадра данных, предлагает вам попытаться создать DF в исполнителях, а это невозможно.

...