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

如何使用不同的模式向dataframe spark scala添加行?

  •  2
  • chaouki  · 技术社区  · 6 年前

    我有这样一个数据帧df:

        ---------------------------------------
        id | k  | v1  | v2     | v3           |
        1  |sc1 | ok  |null    | null         |
        1  |sc2 | no  |null    | null         |
        1  |sc3 | yes |null    | null         |
        1  |sc4 |null |20180318| null         |
        1  |sc5 |null |null    | ["5","2","9"]|
        1  |sc6 |null |20180317|null          |
        1  |sc7 |ok++ |null    |null          |
        2  |sc3 |yes++|null    |null          |
        2  |sc2 |no-- |null    |null          |
        2  |sc7 |ok-- |null    |null          |
        2  |sc4 |null |20180315|null          |
        3  |sc1 | no  |null    |null          |
        3  |sc6 |null |20180313|null          |
        .
        .
    

    我想得到这个结果

         -----------------------------------------------------------------------
        id|  sc1 |sc2 |sc3  |sc4     |sc5          |sc6     |sc7 | sc8 |sc9 | ...  |sck
        1 |ok    |no  |yes  |20180318|["5","2","9"]|20180317|ok++|     |    |      |
        2 |      |no--|yes++|20180315|             |        |ok--|     |    | .... |
        3 |no    |    |     |        |             |20180313|    |     |    | .... |
        .
        .
        n |ok++  |    |yes  |        |["1","0","1"]|        |    |     |ok++| ...  |ok++
        --------------------------------------------------------------------------------
    

    所以我试着用 df.groupby("id").pivot("k") 但是我没有得到一个结果,我想是因为每个中的schema变量当我只使用一个id时,它就可以使用id==1

         |  sc1 |sc2 |sc3  |sc4     |sc5          |sc6     |sc7 |
       1 |ok    |no  |yes  |20180318|["5","2","9"]|20180317|ok++|
    

    这个问题有解决办法吗?提前感谢

    1 回复  |  直到 6 年前
        1
  •  1
  •   Arnon Rotem-Gal-Oz    6 年前

    首先需要创建一个新列,该列基于非null的列和k上的轴,组合了v1、v2和v3

    类似于

    import org.apache.spark.sql.functions.*
    
    val choose = udf((x: String, y: String,z : Array[Int]) => (x,y,z) match {
      case (v, null, null) => v
      case (null,v,null) => v
      case (null,null,v) => v.toString
    })
    
    df.groupby("id").pivot("k").agg(first(choose(v1,v2,v3)))