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