加载CSV-无法通过数据框传递文件路径

时间:2019-06-26 15:49:50

标签: scala apache-spark dataframe databricks azure-databricks

以下代码可以正常工作:

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 个答案:

答案 0 :(得分:1)

  

看起来它采用的路径是“ /mnt/file1.tsv、/mnt/file2.tsv”而不是“ /mnt/file1.tsv”,“ / mnt / file2.tsv”

我怀疑您的问题在这里

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

.mkString将字符串组合在一起。一种可能的解决方案是替换后再次拆分:

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

另一种方法是只替换每个元素,而不是组合成一个字符串:

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

哪一个更适合您。