【问题标题】:Load CSVs - unable to pass file paths from dataframe加载 CSV - 无法从数据框中传递文件路径
【发布时间】:2019-11-08 15:07:09
【问题描述】:

以下代码可以正常工作:

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"

【问题讨论】:

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


    【解决方案1】:

    看起来它正在将路径作为“/mnt/file1.tsv,/mnt/file2.tsv”而不是“/mnt/file1.tsv”,“/mnt/file2.tsv”

    我怀疑你的问题在这里:

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

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

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

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

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

    哪个更适合你。

    【讨论】:

    • 谢谢,成功了!我们需要的是 Array[String] 而不是 String。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-03
    相关资源
    最近更新 更多