如何使用Java/Spring Boot在Azure Databricks创建子目录?ProcessBuilder调用失败排查
在Azure Databricks中用Java创建工作区子目录
可以通过Java实现Azure Databricks工作区子目录的创建,下面提供两种可靠方案:
方案一:直接调用Databricks REST API(推荐)
相比通过ProcessBuilder调用curl,直接用Java HTTP客户端调用Databricks的Workspace API更稳定,也更容易调试。核心是调用/api/2.0/workspace/mkdirs端点,示例代码如下(基于Java 11+ HttpClient):
import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.nio.charset.StandardCharsets; public class DatabricksFolderCreator { public static void main(String[] args) throws Exception { String databricksToken = "<你的Databricks访问令牌>"; String workspaceUrl = "https://<你的Databricks实例>.azuredatabricks.net"; String folderPath = "/Users/xxx@xxx.com/testfolder4"; // 构造请求体 String requestBody = String.format("{ \"path\": \"%s\" }", folderPath); HttpClient client = HttpClient.newHttpClient(); HttpRequest request = HttpRequest.newBuilder() .uri(URI.create(workspaceUrl + "/api/2.0/workspace/mkdirs")) .header("Authorization", "Bearer " + databricksToken) .header("Content-Type", "application/json") .POST(HttpRequest.BodyPublishers.ofString(requestBody, StandardCharsets.UTF_8)) .build(); HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString()); // 处理响应 if (response.statusCode() == 200) { System.out.println("子目录创建成功"); } else { System.err.println("创建失败,响应码:" + response.statusCode() + ",响应内容:" + response.body()); } } }
方案二:修复ProcessBuilder调用curl的问题
如果坚持用ProcessBuilder调用curl,问题通常出在参数拆分错误——不能把整个curl命令作为单个字符串传入,必须将每个命令参数拆分为数组元素,同时注意转义JSON中的双引号。示例代码:
import java.io.IOException; public class CurlProcessBuilder { public static void main(String[] args) throws IOException, InterruptedException { String databricksToken = "<你的Databricks访问令牌>"; String workspaceUrl = "https://<你的Databricks实例>.azuredatabricks.net"; String folderPath = "/Users/xxx@xxx.com/testfolder4"; // 正确拆分curl参数,每个选项和值都是独立元素 ProcessBuilder pb = new ProcessBuilder( "curl", "-n", "-X", "POST", "-H", "Authorization: Bearer " + databricksToken, "-H", "Content-Type: application/json", "-d", "{ \"path\": \"" + folderPath + "\" }", workspaceUrl + "/api/2.0/workspace/mkdirs" ); // 捕获输出和错误信息,方便调试 pb.redirectErrorStream(true); Process process = pb.start(); int exitCode = process.waitFor(); // 读取输出 String output = new String(process.getInputStream().readAllBytes()); if (exitCode == 0) { System.out.println("子目录创建成功,输出:" + output); } else { System.err.println("创建失败,退出码:" + exitCode + ",输出:" + output); } } }
注意事项
- 确保Databricks令牌有足够的权限(至少需要
Workspace权限下的Create权限); - 替换代码中的
<你的Databricks访问令牌>、<你的Databricks实例>和实际的文件夹路径; - 如果使用方案二,要确保运行环境中已安装curl命令。
内容的提问来源于stack exchange,提问作者DIVYA K
相关产品推荐
相关产品推荐

