【问题标题】:how add a row to dataframe spark scala with different schema?如何向具有不同架构的数据框 spark scala 添加一行?
【发布时间】:2018-03-18 18:41:09
【问题描述】:

我有一个这样的数据框 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"),但没有得到结果,我认为这是因为当我只使用一个 id 时,每个模式变量都可以使用,例如 id==1

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

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

【问题讨论】:

    标签: scala apache-spark dataframe group-by pivot


    【解决方案1】:

    您首先需要创建一个新列,该列结合 v1、v2 和 v3,基于非空列和 k 上的枢轴

    类似

    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)))
    

    【讨论】:

    • 感谢 Arnon,它可以工作,但是当我想将其保存到 Mongodb 或简单显示时,我的数据框变成有大量列:11000 给我错误,但是当我选择特定列时,它在我打印时也可以工作架构它工作或 df.count() 也工作,我不知道我应该做什么。
    猜你喜欢
    • 2019-03-26
    • 1970-01-01
    • 2021-01-03
    • 2018-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多