我想通过各种应用程序自动读取hdfs位置的文件。每个应用程序都有不同的基本路径,但大多数应用程序都有相同的分区结构。我正在编写一个函数,它将返回hdfs文件夹结构分区的文件夹结构。下面是我试过的代码,
val TIME_DIMENSION_YEAR = "year"
val TIME_DIMENSION_DAY = "day"
val TIME_DIMENSION_MONTH = "month"
val TIME_DIMENSION_HOUR = "hour"
val currentPerspective = "event"
val timeDim = List("hour", "day", "month", "year")
def getColumnName(perspective: String, dimension: String): String = s"${perspective}_$dimension"
def applyFilter(year: Option[Int], month: Option[Int], day: Option[Int], hour: Option[Int]): String =
timeDim.map(getColumnName(currentPerspective, _)).
foldLeft("/")((acc, dimension) =>
dimension.split("_")(1) match {
case TIME_DIMENSION_DAY => s"/${dimension}=${day.getOrElse("*")}${acc}"
case TIME_DIMENSION_MONTH => s"/${dimension}=${month.getOrElse("*")}${acc}"
case TIME_DIMENSION_YEAR => s"/${dimension}=${year.getOrElse("*")}${acc}"
case TIME_DIMENSION_HOUR => s"/${dimension}=${hour.getOrElse("*")}${acc}"
case _ => null
}
)
预期产量
scala> applyFilter(Some(2020), Some(8), Some(1), None)
res20: String = /event_year=2020/event_month=8/event_day=1/event_hour=*/
问题是, List("hour", "day", "month", "year")
不能更改,并且应按相同的顺序。否则我的文件夹结构将变得毫无意义。而且代码本身是不可移动的,不健壮
有没有更好的方法来实现这一点?我可以改变输入格式/结构任何东西,使代码更健壮和良好的标准?
1条答案
按热度按时间xwbd5t1u1#
您可以使用以下功能:
未将hours和currentperspective传递给函数时函数的示例输出:
未超过小时时函数的示例输出:
说明:
定义函数时,如果没有传递参数值,我们可以声明一个默认值。在scala中,它是使用
parameter : DataType="your_value"
在调用函数时,使用parameter_name="your_value"
这样函数将只对需要默认值的参数使用默认值。