如何在不依赖Python的情况下将本地Parquet文件上传至远程Databricks表?
无需Python上传Parquet至Databricks的方案
一、用Databricks REST API直接上传
Databricks提供了两类REST API可直接上传文件,完全不需要依赖Python。
1. DBFS API(上传到Databricks文件系统)
适合将文件上传到DBFS(Databricks的分布式文件系统),支持小文件直接上传和大文件分块上传:
小文件上传示例(.NET代码)
using System.Net.Http; using System.Net.Http.Headers; using System.IO; using System.Text.Json; var databricksToken = "你的个人访问令牌"; var workspaceUrl = "https://<你的Databricks工作区URL>"; var dbfsTargetPath = "/dbfs/mnt/your-storage/your-file.parquet"; var localParquetPath = @"C:\local-data\output.parquet"; using var httpClient = new HttpClient(); httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", databricksToken); // 直接上传小文件(建议文件大小不超过100MB) var fileContent = new ByteArrayContent(File.ReadAllBytes(localParquetPath)); var uploadResponse = await httpClient.PutAsync( $"{workspaceUrl}/api/2.0/dbfs/put?path={dbfsTargetPath}&overwrite=true", fileContent ); uploadResponse.EnsureSuccessStatusCode();
大文件分块上传示例(.NET代码)
// 初始化客户端和令牌 using var httpClient = new HttpClient(); httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", databricksToken); var dbfsTargetPath = "/dbfs/mnt/your-storage/large-file.parquet"; var localParquetPath = @"C:\local-data\large-output.parquet"; // 第一步:创建文件获取句柄 var createRequest = new { path = dbfsTargetPath, overwrite = true }; var createContent = new StringContent( JsonSerializer.Serialize(createRequest), System.Text.Encoding.UTF8, "application/json" ); var createResponse = await httpClient.PostAsync( $"{workspaceUrl}/api/2.0/dbfs/create", createContent ); createResponse.EnsureSuccessStatusCode(); var handle = JsonSerializer.Deserialize<dynamic>(await createResponse.Content.ReadAsStringAsync()).handle; // 第二步:分块读取并上传(这里用1MB块) using var fileStream = File.OpenRead(localParquetPath); var buffer = new byte[1024 * 1024]; int bytesRead; while ((bytesRead = await fileStream.ReadAsync(buffer, 0, buffer.Length)) > 0) { var blockContent = new ByteArrayContent(buffer, 0, bytesRead); var blockResponse = await httpClient.PostAsync( $"{workspaceUrl}/api/2.0/dbfs/add-block?handle={handle}", blockContent ); blockResponse.EnsureSuccessStatusCode(); } // 第三步:关闭文件完成上传 var closeResponse = await httpClient.PostAsync( $"{workspaceUrl}/api/2.0/dbfs/close?handle={handle}", null ); closeResponse.EnsureSuccessStatusCode();
2. Workspace Files API(上传到Workspace目录)
如果要将文件上传到Databricks Workspace的目录(而非DBFS),可以使用workspace/files/upload端点,用法和DBFS API类似,只是端点路径不同,同样支持分块上传。
二、ODBC的可行性说明
ODBC主要用于查询Databricks中的数据,不能直接通过ODBC上传本地Parquet文件。不过可以通过ODBC执行SQL命令,间接加载已上传到云存储的Parquet文件:
- 先将.NET生成的Parquet文件上传到Databricks可访问的云存储(比如Azure ADLS、AWS S3)
- 通过ODBC连接Databricks,执行
COPY INTO命令加载文件到表中:
COPY INTO my_catalog.my_schema.target_table FROM 'abfss://container@storageaccount.dfs.core.windows.net/path/to/parquets' FILEFORMAT = PARQUET OVERWRITE = TRUE;
这种方式需要依赖云存储作为中转,但全程不需要Python。
三、推荐方案:云存储集成(高效且低成本)
如果你的Databricks部署在云环境,最推荐的流程是:
- .NET项目直接将Parquet文件上传到对应云的存储服务(Azure Blob/ADLS、AWS S3、GCS)
- 在Databricks中创建外部表,或者执行
COPY INTO将云存储中的文件同步到Delta Lake表
这种方式避免了直接上传到Databricks的带宽限制,性能更优,且无需额外依赖Python。
内容的提问来源于stack exchange,提问作者Chechy Levas
相关产品推荐
相关产品推荐

