将SFTP服务器中的文件加载到spark RDD中

时间:2017-04-14 06:21:53

标签: scala apache-spark spark-dataframe

如何将SFTP服务器中的文件加载到spark RDD中。加载此文件后,我需要对数据执行一些过滤。该文件也是csv文件,所以请你帮我决定是否应该使用Dataframes或RDD。

2 个答案:

答案 0 :(得分:2)

您可以通过以下方式在程序中使用spark-sftp库:

适用于Spark 2.x

Maven依赖

<dependency>
    <groupId>com.springml</groupId>
    <artifactId>spark-sftp_2.11</artifactId>
    <version>1.1.0</version>
</dependency>

SBT依赖

libraryDependencies += "com.springml" % "spark-sftp_2.11" % "1.1.0"

使用Spark shell

可以使用--packages命令行选项将此包添加到Spark。例如,要在启动spark shell时包含它:

$ bin/spark-shell --packages com.springml:spark-sftp_2.11:1.1.0

Scala API

// Construct Spark dataframe using file in FTP server
val df = spark.read.
            format("com.springml.spark.sftp").
            option("host", "SFTP_HOST").
            option("username", "SFTP_USER").
            option("password", "****").
            option("fileType", "csv").
            option("inferSchema", "true").
            load("/ftp/files/sample.csv")

// Write dataframe as CSV file to FTP server
df.write.
      format("com.springml.spark.sftp").
      option("host", "SFTP_HOST").
      option("username", "SFTP_USER").
      option("password", "****").
      option("fileType", "csv").
      save("/ftp/files/sample.csv")

适用于Spark 1.x(1.5 +)

Maven依赖

<dependency>
    <groupId>com.springml</groupId>
    <artifactId>spark-sftp_2.10</artifactId>
    <version>1.0.2</version>
</dependency>

SBT依赖

libraryDependencies += "com.springml" % "spark-sftp_2.10" % "1.0.2"

使用Spark shell

可以使用--packages命令行选项将此包添加到Spark。例如,要在启动spark shell时包含它:

$ bin/spark-shell --packages com.springml:spark-sftp_2.10:1.0.2

Scala API

import org.apache.spark.sql.SQLContext

// Construct Spark dataframe using file in FTP server
val sqlContext = new SQLContext(sc)
val df = sqlContext.read.
                    format("com.springml.spark.sftp").
                    option("host", "SFTP_HOST").
                    option("username", "SFTP_USER").
                    option("password", "****").
                    option("fileType", "csv").
                    option("inferSchema", "true").
                    load("/ftp/files/sample.csv")

// Write dataframe as CSV file to FTP server
df.write().
      format("com.springml.spark.sftp").
      option("host", "SFTP_HOST").
      option("username", "SFTP_USER").
      option("password", "****").
      option("fileType", "csv").
      save("/ftp/files/sample.csv")

有关spark-sftp的更多信息,您可以访问github页面springml/spark-sftp

答案 1 :(得分:0)

使用sftp-connector直接从SFTP加载。

https://github.com/springml/spark-sftp

记住它是单线程应用程序并将数据存入hdfs,即使你没有指定它。它将数据流式传输到hdfs,然后在其上创建一个DataFrame

加载时我们需要指定几个参数。

通常在没有指定位置的情况下也可以在用户sud hdfs用户时使用。它将在/ hdfs中创建临时文件,并在完成该过程后将其删除。

 val data = sparkSession.read.format("com.springml.spark.sftp").
      option("host", "host").
      option("username", "user").
      option("password", "password").
      option("fileType", "json").
      option("createDF", "true").
      option("hdfsTempLocation","/user/currentuser/").
      load("/Home/test_mapping.json");

所有可用选项如下,源代码

https://github.com/springml/spark-sftp/blob/master/src/main/scala/com/springml/spark/sftp/DefaultSource.scala

override def createRelation(sqlContext: SQLContext, parameters: Map[String, String], schema: StructType) = {
    val username = parameters.get("username")
    val password = parameters.get("password")
    val pemFileLocation = parameters.get("pem")
    val pemPassphrase = parameters.get("pemPassphrase")
    val host = parameters.getOrElse("host", sys.error("SFTP Host has to be provided using 'host' option"))
    val port = parameters.get("port")
    val path = parameters.getOrElse("path", sys.error("'path' must be specified"))
    val fileType = parameters.getOrElse("fileType", sys.error("File type has to be provided using 'fileType' option"))
    val inferSchema = parameters.get("inferSchema")
    val header = parameters.getOrElse("header", "true")
    val delimiter = parameters.getOrElse("delimiter", ",")
    val createDF = parameters.getOrElse("createDF", "true")
    val copyLatest = parameters.getOrElse("copyLatest", "false")
    //System.setProperty("java.io.tmpdir","hdfs://devnameservice1/../")
    val tempFolder = parameters.getOrElse("tempLocation", System.getProperty("java.io.tmpdir"))
    val hdfsTemp = parameters.getOrElse("hdfsTempLocation", tempFolder)
    val cryptoKey = parameters.getOrElse("cryptoKey", null)
    val cryptoAlgorithm = parameters.getOrElse("cryptoAlgorithm", "AES")

    val supportedFileTypes = List("csv", "json", "avro", "parquet")
    if (!supportedFileTypes.contains(fileType)) {
      sys.error("fileType " + fileType + " not supported. Supported file types are " + supportedFileTypes)
    }