【问题标题】:Merge Rows in Apache spark by eliminating null values通过消除空值来合并 Apache Spark 中的行
【发布时间】:2020-10-03 09:00:21
【问题描述】:

我有一个如下所示的 spark 数据框

+---+----+----+----+----+----+----+
| id|   1|   2|   3|sf_1|sf_2|sf_3|
+---+----+----+----+----+----+----+
|  2|null|null|null| 102| 202| 302|
|  4|null|null|null| 104| 204| 304|
|  1|null|null|null| 101| 201| 301|
|  3|null|null|null| 103| 203| 303|
|  1|  11|  21|  31|null|null|null|
|  2|  12|  22|  32|null|null|null|
|  4|  14|  24|  34|null|null|null|
|  3|  13|  23|  33|null|null|null|
+---+----+----+----+----+----+----+

我想通过合并空行来转换如下数据框

+---+----+----+----+----+----+----+
| id|   1|   2|   3|sf_1|sf_2|sf_3|
+---+----+----+----+----+----+----+
|  1|  11|  21|  31| 101| 201| 301|
|  2|  12|  22|  32| 102| 202| 302|
|  4|  14|  24|  34| 104| 204| 304|
|  3|  13|  23|  33| 103| 203| 303|
+---+----+----+----+----+----+----+

最好在scala中。

【问题讨论】:

    标签: python scala apache-spark pyspark apache-spark-sql


    【解决方案1】:

    您可以对id 进行分组,并使用firstignorenulls 聚合其他列:

    import pyspark.sql.functions as F
    
    (df.groupBy('id').agg(*[F.first(x,ignorenulls=True) for x in df.columns if x!='id'])
    .show())
    

    +---+----+----+----+-----+-----+-----+
    | id|   1|   2|   3| sf_1| sf_2| sf_3|
    +---+----+----+----+-----+-----+-----+
    |  1|11.0|21.0|31.0|101.0|201.0|301.0|
    |  3|13.0|23.0|33.0|103.0|203.0|303.0|
    |  2|12.0|22.0|32.0|102.0|202.0|302.0|
    |  4|14.0|24.0|34.0|104.0|204.0|304.0|
    +---+----+----+----+-----+-----+-----+
    

    【讨论】:

    • 我们可以做这个 scala 吗? F是什么?
    • @Learnis 我没有安装 scala,但应该非常相似,因为 scala 中的功能相似 F 是我导入模块的方式。
    • 好的,Np @anky。谢谢。我正在添加另一个答案。接受你的
    • 除此之外还有什么更好的方法吗?因为 groupBy 是一个非常繁重的操作,我有大约 7k 列
    • @Learnis 我认为我们不能避免分组,但可能有不同的方法。最好发布一个新问题以提高知名度。
    【解决方案2】:

    scala 的做法。

    val inputColumns = inputLoadDF.columns.toList.drop(0)
    val exprs = inputColumns.map(x => first(x,true))
    inputLoadDF.groupBy("id").agg(exprs.head,exprs.tail:_*).show()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-09
      • 2016-11-26
      • 1970-01-01
      • 2021-10-20
      • 1970-01-01
      • 2019-03-16
      • 2022-06-22
      相关资源
      最近更新 更多