从Databricks通过SFTP传输JSON文件及报错求助
Databricks通过SFTP传输JSON文件问题解决指南
错误根源
你安装的com.springml:spark-sftp_2.11:1.1.3是基于Scala 2.11编译的包,但集群用的是Scala 2.12,Scala跨大版本字节码不兼容,直接导致java.lang.NoSuchMethodError这种方法找不到的错误。
修复步骤
1. 替换兼容的SFTP Jar包
删掉现有Scala 2.11版本的jar,换成适配Scala 2.12的版本,推荐用com.springml:spark-sftp_2.12:1.1.5,这个版本支持Scala 2.12和Spark 3.x,能匹配你的集群环境。
2. 完整示例代码
下面是Databricks Notebook可用的完整流程,包含从ADLS读取多JSON文件、写入SFTP的代码:
读取ADLS中的JSON文件
# 替换为你的ADLS实际路径 adls_json_path = "abfss://<容器名>@<存储账户名>.dfs.core.windows.net/folder1/json_files" # 自动读取路径下所有JSON文件 df = spark.read.format("json").load(adls_json_path)
写入SFTP服务器
# 填写你的SFTP配置 sftp_host = "你的SFTP服务器地址" sftp_user = "SFTP用户名" sftp_pwd = "SFTP密码" sftp_target_dir = "/ftp/files/" # SFTP上的目标目录 # 执行写入 df.write.format("com.springml.spark.sftp") \ .option("host", sftp_host) \ .option("username", sftp_user) \ .option("password", sftp_pwd) \ .option("fileType", "json") \ .mode("overwrite") # 可选:append/ignore/error .save(sftp_target_dir)
(可选)生成单个JSON文件上传
默认Spark会生成多个分区文件,若要传单个文件,可先合并再上传:
# ADLS临时目录,用于存放合并后的文件 temp_adls_path = "abfss://<容器名>@<存储账户名>.dfs.core.windows.net/temp/single_json" # 合并为单个文件写入临时目录 df.coalesce(1).write.format("json").mode("overwrite").save(temp_adls_path) # 找到临时目录下的实际JSON文件 temp_files = dbutils.fs.ls(temp_adls_path) single_json_path = [f.path for f in temp_files if f.name.startswith("part-") and f.name.endswith(".json")][0] # 读取单个文件并写入SFTP,指定文件名 single_df = spark.read.format("json").load(single_json_path) single_df.write.format("com.springml.spark.sftp") \ .option("host", sftp_host) \ .option("username", sftp_user) \ .option("password", sftp_pwd) \ .option("fileType", "json") \ .option("fileName", "sample.json") # 指定要生成的文件名 .mode("overwrite") \ .save("/ftp/files/")
额外注意点
- 确保集群已配置ADLS访问权限(比如Service Principal或SAS Token)。
- 确认SFTP服务器允许Databricks集群的出站IP访问。
- 若用密钥登录SFTP,可替换
password参数为:.option("privateKey", "/dbfs/你的私钥路径") \ .option("passphrase", "私钥密码(如果有)")
内容的提问来源于stack exchange,提问作者user1398291
相关产品推荐
相关产品推荐

