【问题标题】:Difference of elements in list in PySparkPySpark中列表中元素的差异
【发布时间】:2020-04-24 14:35:07
【问题描述】:

我有一个 PySpark 数据框 (df),其中有一列包含两个元素的列表。列表中的两个元素不按升序或降序排序。

+--------+----------+-------+
| version| timestamp| list  |
+--------+-----+----|-------+
| v1     |2012-01-10| [5,2] |
| v1     |2012-01-11| [2,5] |
| v1     |2012-01-12| [3,2] |
| v2     |2012-01-12| [2,3] |
| v2     |2012-01-11| [1,2] |
| v2     |2012-01-13| [2,1] |
+--------+----------+-------+

我想在列表的第一个和第二个元素之间获取差异,并将其作为另一列 (diff)。这是我想要的输出示例。

+--------+----------+-------+-------+
| version| timestamp| list  |  diff | 
+--------+-----+----|-------+-------+
| v1     |2012-01-10| [5,2] |   3   |
| v1     |2012-01-11| [2,5] |  -3   |
| v1     |2012-01-12| [3,2] |   1   |
| v2     |2012-01-12| [2,3] |  -1   |
| v2     |2012-01-11| [1,2] |  -1   |
| v2     |2012-01-13| [2,1] |   1   |
+--------+----------+-------+-------+

如何使用 PySpark 做到这一点?

我尝试了以下方法:

transform_expr = (
        "transform(diff, x-y ->"
        + "x as list[0], y as list[1])"
    )

df = df.withColumn("diff", F.expr(transform_expr)) 

但是,上述技术没有给我任何输出。

我也愿意使用 UDF 来获得我想要的输出,以防万一需要。

欢迎使用没有 UDF 的方法和基于 UDF 的方法。谢谢。

【问题讨论】:

    标签: python pandas apache-spark pyspark


    【解决方案1】:

    有多种方法可以做到这一点,您可以使用element_at(Spark 2.4 或更高版本)、transformarray index[0].getItem() 中的任何一个来获得差异。

    #sample dataframe
    df=spark.createDataFrame([([5,2],),([2,5],)],["list"])
    
    #using element_at
    df.withColumn("diff",element_at(col("list"),1) - element_at(col("list"),2)).show()
    
    #using transform 
    df.withColumn("diff",concat_ws("",expr("""transform(array(list),x -> x[0] - x[1])"""))).show()
    
    #using array index
    df.withColumn("diff",col("list")[0]- col("list")[1]).show()
    
    #using .getItem
    df.withColumn("diff",col("list").getItem(0)- col("list").getItem(1)).show()
    
    #+------+----+
    #|  list|diff|
    #+------+----+
    #|[5, 2]|   3|
    #|[2, 5]|  -3|
    #+------+----+
    

    【讨论】:

      猜你喜欢
      • 2018-07-11
      • 1970-01-01
      • 2020-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-24
      • 1970-01-01
      相关资源
      最近更新 更多