首页 > 解决方案 > Spark 读取多个文件:双引号替换为 %22

问题描述

我需要读取数据已更改的不同文件夹中的随机 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

标签: jsonscalaapache-sparkapache-spark-sqlrdd

解决方案


我刚刚用旧版本的 Spark (1.6.0) 尝试了这个,如果你提供单独的路径或通配符模式作为json方法的可变参数,它工作正常,即:

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

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

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

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


推荐阅读