Databricks上的Pyspark在绝对URI中获得相对路径:尝试使用Datestamps读取JSON文件时



我正在尝试在json文件的目录中读取到databricks中的火花数据框架,每当我使用通配符('*'(或启用多行式时,我都会得到the以下错误:

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')

并遇到了上述错误。发现这很奇怪,因为当我直接指定filepath时:

'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)

对为什么会发生这种情况/如何解决此问题的任何想法?

编辑

已经通过其文档进行了广泛的看法,并确认我提供了一条绝对的道路,但是对':s s novered n not Spection n not Spection。

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(,但后来说没有这样的路径?

有什么想法?

,因为您的filepath不是从 /开始的,而是相对的,但是 dbutils期望绝对的filepath。我很惊讶它与相对的filepath一起工作...

请参阅他们的(出色的(文档
https://docs.databricks.com/user-guide/dbfs-databricks-file-system.html#access-dbfs-with-dbutils

😄

您可以使用Spark.Read.Text读取器全文,它也可以与":"一起使用。在文件名中,使用from_json我们可以将模式应用于文本JSON。

最新更新