Невозможно записать данные паркета на локальном уровне, используя искру, добавив метку времени в конце - PullRequest
0 голосов
/ 18 марта 2020

Я пытаюсь добавить строку timestamp/date в конце пути destination, но она не удалась. Если я уберу, то ошибки нет. Я попробовал следующие вещи:

val formatDate = new SimpleDateFormat("yyyy-mm-dd hh:ss")
val newDate = formatDate.format(Calendar.getInstance().getTime())
val finalPath = jobInfo.jobId + "_" + jobInfo.jobRunId + "_" + newDate
df.write.mode(SaveMode.Overwrite).parquet(destPath + "\\" + cTableName + "\\" + finalPath.trim())

Ошибка:

java.io.IOException: Mkdirs failed to create file:/C:/tmp/sparkIF/employees/1000_12_2020-31-18 08:11/_temporary/0/_temporary/attempt_20200318203112_0002_m_000000_2 

Как я вижу, он пытается создать каталоги temporary. Я не уверен, почему это так. Поскольку я использую режим overwrite, существующие каталоги не должны быть проблемой

Ответы [ 2 ]

1 голос
/ 19 марта 2020

Если бы oop не поддерживал точку с запятой в пути к каталогу

Ниже код должен работать

val finalPath = jobInfo.jobId + "_" + jobInfo.jobRunId + "_" + newDate.replaceAll(":","_")
1 голос
/ 19 марта 2020

Я думаю, что проблема в вашем примере в символе пробела в пути. Лучший способ сохранить данные зависит от даты, используя каталог с разделением даты. Посмотрите например:

val cal = Calendar.getInstance()
val datePartitions = Seq(
  s"year=${cal.get(Calendar.YEAR)}",
  s"month=${"%02d".format(cal.get(Calendar.MONTH))}",
  s"day=${"%02d".format(cal.get(Calendar.DAY_OF_MONTH))}",
  s"hour=${"%02d".format(cal.get(Calendar.HOUR))}",
  s"minute=${"%02d".format(cal.get(Calendar.MINUTE))}"
).mkString(File.separator)
val finalPath = s"${jobId}_$jobRunId${File.separator}$datePartitions"
println(s"$destPath${File.separator}$cTableName${File.separator}$finalPath")
// it prints your prefix and year=2020\month=02\day=19\hour=10\minute=03 suffix
...