【问题标题】:Spark reading multiple files : double quotes replaced by %22Spark 读取多个文件:双引号替换为 %22
【发布时间】:2022-03-17 01:32:01
【问题描述】:

我需要读取数据已更改的不同文件夹中的随机 json 文件。所以我不能应用正则表达式来阅读模式。我知道哪些是那些文件,我可以列出它们。但是当我用所有文件路径形成字符串并尝试在 spark 中读取 json 时。双引号被替换为 %22 并且通过 spark 读取文件失败。有人可以帮忙吗?

val FilePath = "\"/path/2019/02/01/*\"" + ","+ "\"path/2019/02/05/*\"" + "\"path/2019/02/24/*\""

FilePath:String = "path/2019/02/20/*","path/2019/02/05/*","path/2019/02/24/*"

现在,当我使用此变量读取 josn 文件时,它会因错误而失败,并且引号被替换为 %22。

spark.read.json(FilePath)

java.lang.IllegalArgumentException: java.net.URISyntaxException: Illegal character in scheme name at index 0: "/path/2019/02/01/*%22,%22/path/2019/02/05/*%22,%22/path/2019/02/24/*%22

【问题讨论】:

  • 为什么在 FilePath 字符串中包含双引号?你试过没有这些吗?
  • 1.使用单引号不起作用 2. 我正在读取目录中的多个文件。所以不知道怎么做,为什么 %22
  • 删除 * 并尝试..

标签: json scala apache-spark apache-spark-sql rdd


【解决方案1】:

我刚刚使用旧版本的 Spark (1.6.0) 进行了尝试,如果您将 separate 路径或通配符模式作为可变参数提供给 json 方法,它可以正常工作,即:

sqlContext.read.json("foo/*", "bar/*")

当您在单个字符串中传递多个模式时,Spark 会尝试从它们构造单个 URI,这是不正确的,它会尝试将引号字符 URL 编码为 %22。

顺便说一句,尝试创建 URI 会失败,因为您的字符串以双引号开头,这是该位置的非法字符 (RFC 3986):

方案名称由一系列以 a 开头的字符组成
字母,后跟字母、数字和加号的任意组合
("+")、句点 (".") 或连字符 ("-")。

【讨论】:

    【解决方案2】:

    在列表中添加路径(例如:pathList)并如下使用

    spark.read.option("basePath", basePath).json(pathList: _*)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-28
      • 1970-01-01
      • 2021-08-08
      相关资源
      最近更新 更多