【发布时间】:2020-09-08 11:46:07
【问题描述】:
我有一个场景,我需要将文件从Azure Blob Storage 复制到Databricks 中的SFTP 位置
有没有办法使用pySpark 或Scala 来实现这种情况?
【问题讨论】:
标签: python scala azure pyspark azure-databricks
我有一个场景,我需要将文件从Azure Blob Storage 复制到Databricks 中的SFTP 位置
有没有办法使用pySpark 或Scala 来实现这种情况?
【问题讨论】:
标签: python scala azure pyspark azure-databricks
关于问题,请参考以下步骤(我使用scala)
dbutils.fs.mount(
source = "<container-name>@<storage-account-name>.blob.core.windows.net",
mountPoint = "/mnt/blob",
extraConfigs = Map("fs.azure.account.key.<storage-account-name>.blob.core.windows.net" -> "<key>"))
dbutils.fs.ls("/mnt/blob")
%sh
cp -R /dbfs/mnt/blob /databricks/driver
ls -R /databricks/driver/blob
com.jcraft.jschvai Mavenimport java.io.File
import scala.sys.process._
import com.jcraft.jsch._
def recursiveListFiles(f: File): Array[File] = {
val these = f.listFiles
these ++ these.filter(_.isDirectory).flatMap(recursiveListFiles)
}
val jsch = new JSch()
val session = jsch.getSession("<usename>", "<host>",<port>) // Set your username and host
session.setPassword("<password>") // Set your password
val config = new java.util.Properties()
config.put("StrictHostKeyChecking", "no")
session.setConfig(config)
session.connect()
val channelSftp = session.openChannel("sftp").asInstanceOf[ChannelSftp]
channelSftp.connect()
val files =recursiveListFiles(new File("/databricks/driver/blob"))
files.foreach(file =>{
if(file.isFile()){
println(file.getPath())
channelSftp.put(file.getPath(),"/home/testqw/upload")
}
})
channelSftp.disconnect()
session.disconnect()
#更新
我们挂载Azure blob后,就可以直接访问文件并上传了。
例如
import java.io.File
import scala.sys.process._
import com.jcraft.jsch._
def recursiveListFiles(f: File): Array[File] = {
val these = f.listFiles
these ++ these.filter(_.isDirectory).flatMap(recursiveListFiles)
}
val jsch = new JSch()
val session = jsch.getSession("", "",22) // Set your username and host
session.setPassword("") // Set your password
val config = new java.util.Properties()
config.put("StrictHostKeyChecking", "no")
session.setConfig(config)
session.connect()
val channelSftp = session.openChannel("sftp").asInstanceOf[ChannelSftp]
channelSftp.connect()
val home = channelSftp.getHome()
val files =recursiveListFiles(new File("/dbfs/mnt/blob"))
files.foreach(file =>{
if(file.isFile()){
println(file.getPath())
channelSftp.put(file.getPath(),"/home/testqw/upload")
}
})
channelSftp.disconnect()
session.disconnect()
【讨论】:
com.jcraft.jsch 上传文件,我们无法从挂载位置访问文件。如果你想从挂载的位置访问文件,我们只能用 spark 读取文件,然后我们可以使用 spark sftp 连接器上传文件。但它有一些限制。我们应该使用 spark 2.x 和 scala 2.1.1:github.com/springml/spark-sftp