基于spark(scala)条件的Union Dataframes

时间:2017-04-11 11:13:16

标签: scala apache-spark

我有一个由4个子文件夹组成的文件夹,其中包含镶木地板文件 文件夹 - > A.parquet,B.parquet,C.parquet,D.parquet(子文件夹)。我的要求是我想基于我提供给方法的文件名来合并数据帧。 我正在使用代码

val df = listDirectoriesGetWantedFile(folderPath,sqlContext,A,B)
def listDirectoriesGetWantedFile(folderPath: String, sqlContext: SQLContext, str1: String, str2: String): DataFrame = {
    var df: DataFrame = null
    val sb = new StringBuilder
    sb.setLength(0)
    var done = false
    val path = new Path(folderPath)
    if (fileSystem.isDirectory(path)) {
        var files = fileSystem.listStatus(path)
        for (file <- files) {
        if (file.getPath.getName.contains(str) && !done) {
          sb.append(file.getPath.toString())
          sb.append(",")
          done = true
        } else if (file.getPath.getName.contains(str2)) {
          sb.append(file.getPath.toString())
        }
    }
}

但是我需要拆分sb然后联合数据帧。我无法找到解决方案。我该如何处理并解决

1 个答案:

答案 0 :(得分:0)

如果我理解你的问题,你可以简单地做这样的事情:

def listDirectoriesGetWantedFile(path: String, 
                                 sqlContext: SQLContext, 
                                 folder1: String, 
                                 folder2: String): DataFrame = {
  val df1 = sqlContext.read.parquet(s"$path/$folder1")
  val df2 = sqlContext.read.parquet(s"$path/$folder2")
  df1.union(df2)
}

修改

通过使用Hadoop FileSystem,您可以检查文件夹中的路径是否存在。所以你可以试试这样的东西:

def listDirectoriesGetWantedFile(path: String, sqlContext: SQLContext, folders: Seq[String]): DataFrame = {
    val conf = new Configuration()
    val fs = FileSystem.get(conf)

    val existingFolders = folders
      .map(folder => new Path(s"$path/$folder"))
      .filter(fs.exists(_))
      .map(_.toString)

    if (existingFolders.isEmpty) {
      sqlContext.emptyDataFrame
    } else {
      sqlContext.read.parquet(existingFolders: _*)
    }
  }