代码之家  ›  专栏  ›  技术社区  ›  Metadata

有没有一种方法可以通过将列表中的元素与Scala中的数组元素进行检查来过滤掉它们?

  •  1
  • Metadata  · 技术社区  · 6 年前

    val hdtList = hdt.split(",").toList
    hdtList.foreach(println)
    Output:
        forecast_id bigint,period_year bigint,period_num bigint,period_name string,drm_org string,ledger_id bigint,currency_code string,source_system_name string,source_record_type string,gl_source_name string,gl_source_system_name string,year string,period string
    

    有一个数组,它是从数据帧中获取的,并将其列转换为数组,如下所示:

    val partition_columns   = spColsDF.select("partition_columns").collect.flatMap(x => x.getAs[String](0).split(","))
    partition_columns.foreach(println)
    Output:
    source_system_name
    period_year
    

    有没有办法过滤掉这些元素: source_system_name string, period_year bigint hdtList partition_columns 把他们放进新的名单。 我不知道如何在正确的集合上适当地应用过滤器/映射并比较它们。 有人能告诉我怎么才能做到吗?

    3 回复  |  直到 6 年前
        1
  •  1
  •   jwvh    6 年前

    partition_columns ,以及不是的hdt元素。

    val (pc
        ,notPc) = hdtList.partition( w =>
                          partition_columns.contains(w.takeWhile(_!=' ')))
    //pc: List[String] = List(period_year bigint, source_system_name string)
    //notPc: List[String] = List(forecast_id bigint, period_num bigint, ... etc.
    
        2
  •  2
  •   Roberto Bonvallet Sebastian Celestino    6 年前

    除非我误解了这个问题,否则我认为这就是你需要的:

    val filtered = hdtList.filter { x =>
      !partition_columns.exists { col => x.startsWith(col) }
    }
    
        3
  •  2
  •   Sebastian Celestino    6 年前

    在您的例子中,您需要使用filter,因为您需要从hdtList中删除元素。

    Map是一个转换元素的函数,无法使用Map从集合中移除元素。如果你有一个X元素的列表,在映射执行之后,你有X个元素,不是更少,不是更多。

    val newList = hdtList.filter( x => partition_columns.exists(x.startsWith) )
    

    解决这个问题的一种方法是使用集合。