Мне нужна ваша помощь, потому что я новичок в Spark Framework
.
У меня есть папка с большим количеством паркетных файлов.Название этих файлов имеет одинаковый формат: DD-MM-YYYY
.Например: '01-10-2018'
, '02-10-2018'
, '03-10-2018'
и т. Д.
Мое приложение имеет два входных параметра: dateFrom
и dateTo
.
Когда я пытаюсь использовать следующийкод приложения зависает.Похоже, приложение сканирует все файлы в папке.
val mf = spark.read.parquet("/PATH_TO_THE_FOLDER/*")
.filter($"DATE".between(dateFrom + " 00:00:00", dateTo + " 23:59:59"))
mf.show()
Мне нужно использовать пул данных за период как можно быстрее.
Я думаю, было бы здорово разделить период на дни.и затем читайте файлы отдельно, присоединяйте их так:
val mf1 = spark.read.parquet("/PATH_TO_THE_FOLDER/01-10-2018");
val mf2 = spark.read.parquet("/PATH_TO_THE_FOLDER/02-10-2018");
val final = mf1.union(mf2).distinct();
dateFrom
и dateTo
являются динамическими, поэтому я не знаю, как правильно организовать код прямо сейчас.Пожалуйста, помогите!
@ y2k-shubham Я пытался проверить следующий код, но он вызывает ошибку:
import org.joda.time.{DateTime, Days}
import org.apache.spark.sql.{DataFrame, SparkSession}
val dateFrom = DateTime.parse("2018-10-01")
val dateTo = DateTime.parse("2018-10-05")
def getDaysInBetween(from: DateTime, to: DateTime): Int = Days.daysBetween(from, to).getDays
def getDatesInBetween(from: DateTime, to: DateTime): Seq[DateTime] = {
val days = getDaysInBetween(from, to)
(0 to days).map(day => from.plusDays(day).withTimeAtStartOfDay())
}
val datesInBetween: Seq[DateTime] = getDatesInBetween(dateFrom, dateTo)
val unionDf: DataFrame = datesInBetween.foldLeft(spark.emptyDataFrame) { (intermediateDf: DataFrame, date: DateTime) =>
intermediateDf.union(spark.read.parquet("PATH" + date.toString("yyyy-MM-dd") + "/*.parquet"))
}
unionDf.show()
ОШИБКА :
org.apache.spark.sql.AnalysisException: Union can only be performed on tables with the same number of columns, but the first table has 0 columns and the second table has 20 columns;
Кажется, что intermediateDf
DateFrame при запуске пуст.Как решить проблему?