Загружать файлы CSV - невозможно передать пути к файлам из фрейма данных - PullRequest
0 голосов
/ 26 июня 2019

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

val Path = Seq (
"dbfs:/mnt/testdata/2019/02/Calls2019-02-03.tsv",
"dbfs:/mnt/testdata/2019/02/Calls2019-02-02.tsv"
)

val Calls = spark.read
       .format("com.databricks.spark.csv")
       .option("header", "true")
       .option("delimiter", "\t")
       .schema(schema)
       .load(Path: _*)

Но я хочу получить пути из кадра данных, и приведенный ниже код не работает.

val tsvPath = 
Seq(
 FinalFileList
.select($"Path")
.filter($"FileDate">MaxStartTime)
.collect.mkString(",")
.replaceAll("[\\[\\]]","")
 )

val Calls = spark.read
       .format("com.databricks.spark.csv")
       .option("header", "true")
       .option("delimiter", "\t")
       .schema(schema)
       .load(tsvPath: _*)

Ошибка:

org.apache.spark.sql.AnalysisException: Path does not exist: dbfs:/mnt/testdata/2019/02/Calls2019-02-03.tsv,dbfs:/mnt/testdata/2019/02/Calls2019-02-02.tsv;

Похоже, он выбирает путь как "/mnt/file1.tsv, /mnt/file2.tsv" вместо "/mnt/file1.tsv","/mnt/file2.tsv"

1 Ответ

1 голос
/ 26 июня 2019

Похоже, что он принимает путь как "/mnt/file1.tsv, /mnt/file2.tsv" вместо "/mnt/file1.tsv","/mnt/file2.tsv"

Я подозреваю, что ваша проблема здесь:

.collect.mkString(",")
.replaceAll("[\\[\\]]","")

.mkString объединяет строки в одну.Одним из возможных решений здесь является повторное разбиение после замены:

.collect.mkString(",")
.replaceAll("[\\[\\]]","")
.split(",")

Другое - просто заменить каждый элемент вместо объединения в строку:

.collect.foreach(_.replaceAll("[\\[\\]]",""))

В зависимости от того, какой из них больше подходитвы.

...