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

Posted

技术标签:

【中文标题】Databricks 上的 PySpark 在绝对 URI 中获取相对路径:尝试使用 DateStamps 读取 Json 文件时【英文标题】:PySpark on Databricks getting Relative path in absolute URI: when trying to read in Json Files with DateStamps 【发布时间】: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) 但它说不存在这样的路径?

有什么想法吗?

【问题讨论】:

【参考方案1】:

因为您的文件路径不是以 / 开头,所以它是相对的,但 dbutils 需要一个绝对文件路径。我很惊讶它完全适用于相对文件路径......

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

?

【讨论】:

感谢@Steven 的回复,但我不确定这是不是问题: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'" 这是一个绝对文件路径。 使用他们的文档,它似乎适用于所有其他文件,除了那些带有':'的文件。

以上是关于Databricks 上的 PySpark 在绝对 URI 中获取相对路径:尝试使用 DateStamps 读取 Json 文件时的主要内容,如果未能解决你的问题,请参考以下文章

读取 csv 文件时 MS Databricks Spark 中绝对 URI 中的相对路径

使用 Pyspark 将 SQL 查询从 DataBricks 发送到 SQL Server [重复]

无法在 Databricks 中使用 pyspark 读取 json 文件

如何在 Databricks 的 PySpark 中使用在 Scala 中创建的 DataFrame

PySpark:如何将 GitHub 库导入 Databricks?

如何使用 Python / Pyspark 在 Databricks 笔记本中合并数据帧