pyspark在databricks上获取绝对uri中的相对路径:在尝试读取带有日期戳的json文件时

w80xi6nr  于 2021-06-01  发布在  Hadoop
关注(0)|答案(1)|浏览(289)

我试图在一个json文件目录中读取databricks中的sparkDataframe,每当我使用通配符('*')或启用多行时,都会出现以下错误:

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),但是它说不存在这样的路径?
有什么想法吗?

f0brbegy

f0brbegy1#

因为你的文件路径不是以 / 这是相对的,但是 dbutils 需要绝对文件路径。我很惊讶它能与相对文件路径一起工作。。。
看看他们(优秀的)医生
https://docs.databricks.com/user-guide/dbfs-databricks-file-system.html#access-带dbutils的dbfs
?

相关问题