首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有更好的方法从可用的分区列名中查找HDFS分区文件夹?

有没有更好的方法从可用的分区列名中查找HDFS分区文件夹?
EN

Stack Overflow用户
提问于 2020-09-21 19:59:29
回答 1查看 33关注 0票数 0

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

代码语言:javascript
复制
  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
          }
    )

预期输出

代码语言:javascript
复制
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")不能更改,并且应该是相同的顺序。否则我的文件夹结构将变得毫无意义。代码本身是不可移动的,并且不健壮。

有没有更好的方法来实现这一点?我可以改变输入格式/结构,使代码更健壮和更好的标准吗?

EN

回答 1

Stack Overflow用户

发布于 2020-09-22 00:12:40

您可以使用以下函数:

代码语言:javascript
复制
def applyFilter(year: String="*", month: String="*", day: String="*", hour: String="*",currentPerspective:String="default"):String = {
s"/${currentPerspective}_year=${year}/${currentPerspective}_month=${month}/${currentPerspective}_day=${day}/${currentPerspective}_hour=${hour}/"
}

未将小时数和currentPerspective传递给函数时,函数的输出示例:

代码语言:javascript
复制
applyFilter(year="2020",month="2",day="12")

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

代码语言:javascript
复制
applyFilter(year="2020",month="2",day="12",currentPerspective="event")

解释:

定义函数时,如果未传递参数值,则可以声明默认值。在scala中,它是使用parameter : DataType="your_value"定义的,并且在调用函数时使用parameter_name="your_value"指定参数,这样函数将只对需要默认值的参数使用默认值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63991844

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档