有没有更好的方法从可用的分区列名中读取和查找hdfs分区文件夹?

bxgwgixi  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(398)

我想通过各种应用程序自动读取hdfs位置的文件。每个应用程序都有不同的基本路径,但大多数应用程序都有相同的分区结构。我正在编写一个函数,它将返回hdfs文件夹结构分区的文件夹结构。下面是我试过的代码,

  1. val TIME_DIMENSION_YEAR = "year"
  2. val TIME_DIMENSION_DAY = "day"
  3. val TIME_DIMENSION_MONTH = "month"
  4. val TIME_DIMENSION_HOUR = "hour"
  5. val currentPerspective = "event"
  6. val timeDim = List("hour", "day", "month", "year")
  7. def getColumnName(perspective: String, dimension: String): String = s"${perspective}_$dimension"
  8. def applyFilter(year: Option[Int], month: Option[Int], day: Option[Int], hour: Option[Int]): String =
  9. timeDim.map(getColumnName(currentPerspective, _)).
  10. foldLeft("/")((acc, dimension) =>
  11. dimension.split("_")(1) match {
  12. case TIME_DIMENSION_DAY => s"/${dimension}=${day.getOrElse("*")}${acc}"
  13. case TIME_DIMENSION_MONTH => s"/${dimension}=${month.getOrElse("*")}${acc}"
  14. case TIME_DIMENSION_YEAR => s"/${dimension}=${year.getOrElse("*")}${acc}"
  15. case TIME_DIMENSION_HOUR => s"/${dimension}=${hour.getOrElse("*")}${acc}"
  16. case _ => null
  17. }
  18. )

预期产量

  1. scala> applyFilter(Some(2020), Some(8), Some(1), None)
  2. res20: String = /event_year=2020/event_month=8/event_day=1/event_hour=*/

问题是, List("hour", "day", "month", "year") 不能更改,并且应按相同的顺序。否则我的文件夹结构将变得毫无意义。而且代码本身是不可移动的,不健壮
有没有更好的方法来实现这一点?我可以改变输入格式/结构任何东西,使代码更健壮和良好的标准?

xwbd5t1u

xwbd5t1u1#

您可以使用以下功能:

  1. def applyFilter(year: String="*", month: String="*", day: String="*", hour: String="*",currentPerspective:String="default"):String = {
  2. s"/${currentPerspective}_year=${year}/${currentPerspective}_month=${month}/${currentPerspective}_day=${day}/${currentPerspective}_hour=${hour}/"
  3. }

未将hours和currentperspective传递给函数时函数的示例输出:

  1. applyFilter(year="2020",month="2",day="12")


未超过小时时函数的示例输出:

  1. applyFilter(year="2020",month="2",day="12",currentPerspective="event")


说明:
定义函数时,如果没有传递参数值,我们可以声明一个默认值。在scala中,它是使用 parameter : DataType="your_value" 在调用函数时,使用 parameter_name="your_value" 这样函数将只对需要默认值的参数使用默认值。

展开查看全部

相关问题