У меня проблемы с чтением нескольких фреймов данных. У меня есть эта функция
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
, если это возможно. Как можно достичь моей цели?