【问题标题】:how to convert map into key value pair如何将map转换为键值对
【发布时间】:2017-09-15 15:52:50
【问题描述】:

如下:

test: Array[scala.collection.immutable.Map[String,Any]] = Array(
Map(_c3 -> "foobar", _c5 -> "impt", _c0 -> Key1, _c4 -> 20.0, _c1 -> "next",  _c2 -> 1.0), 
Map(_c3 -> "high", _c5 -> "low", _c0 -> Key2, _c4 -> 19.0, _c1 -> "great",  _c2 -> 0.0),
Map(_c3 -> "book", _c5 -> "game", _c0 -> Key3, _c4 -> 42.0, _c1 -> "name",  _c2 -> 0.5)
)

如何根据仅包含 Strings_c0 将其转换为 Key Value 对? 如下所示

Key1 foobar
Key1 impt
Key1 next
Key2 high
Key2 low
Key2 great
Key3 book
Key3 game
Key3 name

【问题讨论】:

    标签: scala apache-spark


    【解决方案1】:

    请检查一下

    test.map(
        _.filter(!_._2.toString.matches("[+-]?\\d+.?\\d+"))
      ).flatMap(
        data =>
          {
            val key = data.getOrElse("_c0", "key_not_found")
            data
              .filter(_._1 != "_c0")
              .map(
                key +" "+_._2.toString()
              )
          }
      )
    

    【讨论】:

      【解决方案2】:

      试试这个方法

      import org.apache.spark.sql.functions._
      
      # first extract all values which are string
      val rdd = sc.parallelize(test).map(x => (x.getOrElse("_c0","no key").toString -> (x - "_c0").values.filter(_.isInstanceOf[String]).asInstanceOf[List[String]]))
      
      
      val df = spark.createDataFrame(rdd).toDF("key", "vals")
      
      # use explode function to add new rows
      df.withColumn("vals", explode(col("vals"))).show()
      

      【讨论】:

        【解决方案3】:

        怎么样:

        test
         .map(row => row.getOrElse(_c0, "") -> (row - _c0).values.filter(_.isInstanceOf[String]))
         .flatMap { case (key, innerList) => innerList.map(key -> _) }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-05-22
          • 2020-08-03
          • 2021-04-24
          • 1970-01-01
          • 2019-02-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多