【发布时间】:2018-03-26 11:16:00
【问题描述】:
我试图在 JSON 文件目录中读取数据块中的 spark 数据帧,每当我使用通配符 ('*') 或启用多行时,我都会收到以下错误:
IllegalArgumentException: 'java.net.URISyntaxException: Relative path in
absolute URI: 2017-08-17T06:01:02Z-077d951a-3848-422b-9a4c-a3b648dde0ac.json'
在尝试使用通配符时第一次遇到这种情况:
t= 'mnt/data/2017-08-17/06/*.json'
rdf = spark.read.load(t, 'json')
并得到上述错误。发现这很奇怪,因为当我直接指定文件路径时:
'dbfs:/mnt/data/2017-08-17/06/2017-08-17T06:01:02Z-077d951a-3848-422b-9a4c-a3b648dde0ac.json'
所以我实施了这个修复:
rpaths = list(dbutils.fs.ls("mnt/data/2017-08-17/06/"))
rdf = spark.read.load(rpaths[0].path, 'json')
for i in range(1, len(rpaths)):
temp = spark.read.load(rpaths[i].path, 'json')
rdf = rdf.union(temp)
在我尝试启用多行 json 之前效果很好:
rpaths = list(dbutils.fs.ls("mnt/data/2017-08-17/06/"))
rdf = spark.read.load(rpaths[0].path, 'json', multiline = 'true')
for i in range(1, len(rpaths)):
temp = spark.read.load(rpaths[i].path, 'json')
rdf = rdf.union(temp)
并得到与上述相同的错误。
尝试 URLEncode 是因为我认为它与文件名中的 ':' 字符有关,但它仍然给我同样的错误。
from urllib.parse import urlparse
rpaths = list(dbutils.fs.ls("mnt/data/2017-08-17/06/"))
rdf = spark.read.load(urlparse(rpaths[0].path).path, 'json', multiline = True)
知道为什么会发生这种情况/我将如何解决这个问题吗?
编辑
仔细查看了他们的文档,并确认我提供的是绝对路径,但它没有说明不支持 ':'。
t= '/mnt/data/2017-08-17/06/*.json'
rdf = spark.read.load(t, 'json', multiline = True)
仍然给出同样的问题。使用 DButils 时的路径解析为:
'dbfs:/mnt/data/2017-08-17/06/2017-08-17T06:01:02Z-077d951a-3848-422b-9a4c-a3b648dde0ac.json'
哪个是绝对文件路径
我认为这可能与冒号 (':') 字符有关。似乎 ':' 在 URI 中具有特殊含义,这就是 HDFS 使用的。我试图转义字符 (%3A) 但它说不存在这样的路径?
有什么想法吗?
【问题讨论】:
标签: python apache-spark hadoop pyspark hdfs