PySpark on Databricks在绝对URI中获取相对路径:尝试使用DateStamps读取Json文件时

时间:2018-03-26 11:16:00

标签: python apache-spark hadoop pyspark hdfs

我试图在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)

在我尝试启用multiline 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)但是它说没有这样的路径?

任何想法?

1 个答案:

答案 0 :(得分:0)

因为你的文件路径不以/的相对开头,但是dbutils期望一个绝对的文件路径。我很惊讶它与相对文件路径一起工作......

查看他们的(优秀)文档 https://docs.databricks.com/user-guide/dbfs-databricks-file-system.html#access-dbfs-with-dbutils