包含子文件夹的文件夹顶部的分区表,子文件夹包含spark中的json文件



我正在Databricks中处理spark。我有一个存储位置的装载点指向我的目录。让我们将目录称为"/mnt/abc1/abc2"-路径在这个";abc2";目录,比方说我有10个名为"的文件夹;xyz1"xyz10";。所有这些";xyz%";文件夹包含json文件,让我们称之为"json";xyz1_1.json";,等等。我需要构建一个表,这样我就可以通过将json引用为路径+"来访问spark表;abc2.xyz1.xyz1_1.json";

var path = "/mnt/abc1/"
var data = spark.read.json(path)

当json文件直接位于路径内,而不是位于我们路径中的文件夹内时,这就起作用了。我想找出一种方法,可以自动检测底层文件夹和包含json的子文件夹,并在其上构建表

使用spark 3+,您可以将选项recursiveFileLookup添加为true以搜索子目录

var path = "/mnt/abc1/"
var data = spark.read.option("recursiveFileLookup","true").json(path)

Try Below代码。

import org.apache.hadoop.fs.{FileSystem, Path, RemoteIterator}
import org.apache.spark.sql.SparkSession
import scala.util.{Failure, Success, Try}
case class Hdfs(fs: FileSystem) {
implicit def convertToScalaIterator[T](remoteIterator: RemoteIterator[T]): Iterator[T] = {
case class wrapper(remoteIterator: RemoteIterator[T]) extends Iterator[T] {
override def hasNext: Boolean = remoteIterator.hasNext
override def next(): T = remoteIterator.next()
}
wrapper(remoteIterator)
}
def listFiles(path: String): List[String] = {
Try(
fs
.listFiles(new Path(path), true)
.toList
.map(_.getPath)
.filter(!_.toString.contains("_spark_metadata"))
.map(_.toString)
) match {
case Success(files) => files
case Failure(ex) => Nil
}
}
}

使用spark会话获取hdfs对象。

val hdfs = Hdfs(FileSystem.get(spark.sparkContext.hadoopConfiguration))

使用listFiles函数递归地获取文件列表。

val files = hdfs.listFiles("/mnt/abc1/")

检查文件是否在hdfs路径中可用。

if(!files.isEmpty) val data = spark.read.json(files:_*)

相关内容

最新更新