【问题标题】:Pyspark: reshape data without aggregationPyspark:无需聚合即可重塑数据
【发布时间】:2019-04-05 19:04:40
【问题描述】:

我想在不聚合的情况下在 pyspark 中将我的数据从 4x3 重塑为 2x2。我目前的输出如下:

columns = ['FAULTY', 'value_HIGH', 'count']
vals = [
    (1, 0, 141),
    (0, 0, 140),
    (1, 1, 21),
    (0, 1, 12)
]

我想要的是一个列联表,其中第二列是两个新的二进制列(value_HIGH_1value_HIGH_0)和来自count 列的值 - 含义:

columns = ['FAULTY', 'value_HIGH_1', 'value_HIGH_0']
vals = [
    (1, 21, 141),
    (0, 12, 140)
]

【问题讨论】:

    标签: apache-spark pyspark contingency


    【解决方案1】:

    使用groupbypivotnatural way to do this,但是如果你想避免任何聚合,你可以使用filterjoin 来实现这一点

    import pyspark.sql.functions as f
    
    df.where("value_HIGH = 1").select("FAULTY", f.col("count").alias("value_HIGH_1"))\
        .join(
            df.where("value_HIGH = 0").select("FAULTY", f.col("count").alias("value_HIGH_1")),
            on="FAULTY"
        )\
        .show()
    #+------+------------+------------+
    #|FAULTY|value_HIGH_1|value_HIGH_1|
    #+------+------------+------------+
    #|     0|          12|         140|
    #|     1|          21|         141|
    #+------+------------+------------+
    

    【讨论】:

      【解决方案2】:

      您可以将pivot假最大聚合一起使用(因为每个组只有一个元素):

      import pyspark.sql.functions as F
      df.groupBy('FAULTY').pivot('value_HIGH').agg(F.max('count')).selectExpr(
          'FAULTY', '`1` as value_high_1', '`0` as value_high_0'
      ).show()
      +------+------------+------------+
      |FAULTY|value_high_1|value_high_0|
      +------+------------+------------+
      |     0|          12|         140|
      |     1|          21|         141|
      +------+------------+------------+
      

      【讨论】:

      • 不错的一个。但是,作为他的要求,我们不能在不聚合的情况下实现这一点吗?
      • @Prazy 我不知道 spark 甚至 sql 有这样的语法。旋转时总是涉及聚合 -
      • @Psidom 在这种情况下,您可以将values = [0,1] 作为第二个参数传递给pivot,这样效率更高。
      • @pault 好电话-
      猜你喜欢
      • 2015-10-14
      • 1970-01-01
      • 1970-01-01
      • 2019-04-08
      • 2019-01-07
      • 1970-01-01
      • 2014-10-10
      • 1970-01-01
      • 2015-02-03
      相关资源
      最近更新 更多