在Databricks 8.3(Spark3.1.1)环境下PySpark读取URL内容失败如何解决
根因说明
你原本使用的spark.sparkContext.addFile()仅会将目标文件下载到Databricks集群的驱动节点本地磁盘,Spark读取文件时任务是下发到Executor节点执行的,Executor节点本地不存在该文件,因此触发文件不存在的读取错误。该接口本身设计用于分发作业依赖的小体积配置、脚本文件,不适用于分发待读取的业务数据。
可行解决方案
方案1:小体积文件直接读取(单文件小于1GB适用)
直接用Python requests库拉取文件内容,转成Spark DataFrame,无需落地到存储:
import requests from pyspark.sql.types import StringType url = 'https://pds-atmospheres.nmsu.edu/PDS/data/mors_1101/tps/1998_028/8028d38a.tps' resp = requests.get(url) # 先校验请求是否正常,可提前排查网络权限问题 resp.raise_for_status() # 按行拆分内容直接构造DataFrame df1 = spark.createDataFrame(resp.text.splitlines(), StringType()).toDF("value") df1.show()
方案2:大体积文件落地DBFS读取(单文件大于1GB适用)
先将文件下载到驱动本地,再转存到所有节点都可访问的DBFS共享存储,再用Spark读取:
import requests url = 'https://pds-atmospheres.nmsu.edu/PDS/data/mors_1101/tps/1998_028/8028d38a.tps' local_path = "/tmp/8028d38a.tps" dbfs_path = "/data/8028d38a.tps" # 下载到驱动节点本地 resp = requests.get(url) resp.raise_for_status() with open(local_path, "wb") as f: f.write(resp.content) # 转存到DBFS共享路径 dbutils.fs.cp(f"file:{local_path}", f"dbfs:{dbfs_path}") # 从DBFS读取文件 df1 = spark.read.text(dbfs_path) df1.show()
前置校验项
如果运行上述代码仍报错,先执行以下命令排查网络权限:
import requests url = 'https://pds-atmospheres.nmsu.edu/PDS/data/mors_1101/tps/1998_028/8028d38a.tps' print(requests.get(url).status_code)
如果返回值不是200,说明集群没有公网访问该域名的权限,需联系集群管理员开通对应域名的公网访问权限或配置出口代理。
内容的提问来源于stack exchange,提问作者Alex Raj Kaliamoorthy
相关产品推荐
相关产品推荐

