Databricks中使用Jupyter文件上传组件读取本地文件超时问题求助
Databricks笔记本本地文件上传超时问题解决建议
问题背景
- 尝试在Databricks笔记本中使用Jupyter组件(ipywidgets/ipyvuetify)读取本地文件
- ipywidgets的文件上传功能被Databricks官方限制,无法使用
- 改用ipyvuetify的
FileInput组件后,文件选择功能正常,但调用read()方法时触发超时异常
尝试的代码
from ipyvuetify.extra import FileInput file_input = FileInput() file_input
files = file_input.get_files() data = files[0]['file_obj'].read() data
报错信息
Exception Traceback (most recent call last) File <command-2037501063098494>:1 ----> 1 data = files[0]['file_obj'].read() 2 data File /lib/python3.9/site-packages/ipyvuetify/extra/file_input.py:147, in ClientSideFile.readall(self) 146 def readall(self): --> 147 return self.read(self.size - self.offset) File /lib/python3.9/site-packages/ipyvuetify/extra/file_input.py:143, in ClientSideFile.readinto(self, buffer) 140 self.widget.update_stats(self.file_index, chunk_size) 141 await process_messages() --> 143 asyncio.run(read_all()) 144 return size File /databricks/python/lib/python3.9/site-packages/nest_asyncio.py:35, in _patch_asyncio.<locals>.run(main, debug) 33 task = asyncio.ensure_future(main) 34 try:
解决建议
针对ipyvuetify超时问题的修复
- 调整异步运行环境:Databricks的
nest_asyncio环境可能限制了异步任务的执行时间,可尝试重置事件循环配置:import asyncio asyncio.get_event_loop().set_default_executor(None) - 分块读取大文件:避免一次性读取整个文件,手动分块读取降低单次请求压力:
chunk_size = 1024 * 1024 # 按1MB分块读取 file_obj = files[0]['file_obj'] data = b'' while True: chunk = file_obj.read(chunk_size) if not chunk: break data += chunk
Databricks本地文件上传替代方案
- 使用内置上传功能:直接通过笔记本界面的「文件」→「上传数据」,将文件上传到DBFS后读取:
# Spark读取DBFS文件 df = spark.read.csv("/FileStore/tables/your_uploaded_file.csv") # 读取二进制文件内容 data = dbutils.fs.head("/FileStore/tables/your_binary_file.bin", 1000000) - 嵌入HTML表单上传:通过HTML+JS将本地文件内容转成Base64传递到Python变量:
解码数据:from IPython.display import HTML, display import base64 upload_form = HTML(""" <input type="file" id="fileInput"> <button onclick="uploadFile()">上传</button> <script> async function uploadFile() { const file = document.getElementById('fileInput').files[0]; const reader = new FileReader(); reader.onload = function(e) { const base64Data = e.target.result.split(',')[1]; IPython.notebook.kernel.execute(`file_data = b'${base64Data}'`); alert('上传完成'); }; reader.readAsDataURL(file); } </script> """) display(upload_form)decoded_data = base64.b64decode(file_data) - Databricks CLI上传:本地安装CLI后,通过命令行将文件上传到DBFS:
再在笔记本中读取DBFS路径下的文件。databricks fs cp /local/path/your_file.dbfs:/FileStore/tables/your_file
内容的提问来源于stack exchange,提问作者ntnrjdn
相关产品推荐
相关产品推荐

