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

有什么想法吗?

【问题讨论】:

    标签: python apache-spark hadoop pyspark hdfs


    【解决方案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'" 这是一个绝对文件路径。
    • 使用他们的文档,它似乎适用于所有其他文件,除了那些带有':'的文件。
    猜你喜欢
    • 1970-01-01
    • 2018-07-27
    • 2014-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-19
    • 2023-01-26
    • 1970-01-01
    相关资源
    最近更新 更多