获取 PySpark 列中列表列表中第一个元素的最大值

Posted

技术标签:

【中文标题】获取 PySpark 列中列表列表中第一个元素的最大值【英文标题】:getting maximum value for first element in list of lists in PySpark column 【发布时间】:2020-05-13 17:04:15 【问题描述】:

我有一个 PySpark 列,其中包含这样的列表列表的值

row 1: [['01', '100.0'], ['01', '400.0'], [None, '0.0'], ['06', '0.0'], ['01', '300'], [None, '0.0'], ['06', '200.0']]
row 2: [[None, '200.0'], ['06', '300.0'], ['01', '500'], ['06', '100.0'], ['01', '200'], ['07', '50.0']]

我需要比较列表列表中具有相同第一个元素的元素,并过滤掉每对中具有最大第二个元素的数组。虽然数组的第一个元素可能有不同的代码,但我想过滤掉包含 '01' 、 '06' 或 '07' 的数组元素,并在我的数据框中添加两列。

所以上面示例行的结果如下所示:

[['01', '400.0'], ['06', '200.0'], ['07':'0']
[['01', '500.0'], ['06', '300.0'], ['07':'50']

最有效的方法是什么?

【问题讨论】:

你能发布你到目前为止尝试过的代码吗? 我可以假设将提供要添加 max_01、max_06、max_07 的列列表,还是我必须从列表列表中确定? 我们可以为01、06和07这三个代码做一个withColumn。 【参考方案1】:

应该这样做:

from pyspark.sql import functions as F

df.withColumn("Max_01",F.when(F.size(F.expr("""filter(arr,x-> exists(x,y->y='01'))"""))!=0,
       F.expr("""array_max(transform(filter(arr, x-> exists(x,y-> y='01')),z-> float(z[1])))"""))\
             .otherwise(F.lit(0)))\
  .withColumn("Max_06",F.when(F.size(F.expr("""filter(arr,x-> exists(x,y->y='06'))"""))!=0,
       F.expr("""array_max(transform(filter(arr, x-> exists(x,y-> y='06')),z-> float(z[1])))"""))\
             .otherwise(F.lit(0)))\
  .withColumn("Max_07",F.when(F.size(F.expr("""filter(arr,x-> exists(x,y->y='07'))"""))!=0,
       F.expr("""array_max(transform(filter(arr, x-> exists(x,y-> y='07')),z-> float(z[1])))"""))\
             .otherwise(F.lit(0)))\
   .show(truncate=False)

#+---------------------------------------------------------------------------------+------+------+------+
#|arr                                                                              |Max_01|Max_06|Max_07|
#+---------------------------------------------------------------------------------+------+------+------+
#|[[01, 100.0], [01, 400.0], [, 0.0], [06, 0.0], [01, 400.0], [, 0.0], [06, 200.0]]|400.0 |200.0 |0.0   |
#|[[, 200.0], [06, 300.0], [01, 500], [06, 100.0], [01, 200], [07, 50.0]]          |500.0 |300.0 |50.0  |
#+---------------------------------------------------------------------------------+------+------+------+

【讨论】:

非常感谢!这解决了我在您提供给另一个问题的解决方案的评论中提到的问题。

以上是关于获取 PySpark 列中列表列表中第一个元素的最大值的主要内容,如果未能解决你的问题,请参考以下文章

数据框列中的嵌套列表,提取数据框列中列表的值 Pyspark Spark

嵌套列表中第一个元素的总和

计算单个列中列表中值的实例

pyspark:获取列表值的不同元素

如何从 pyspark 数据框列中的列表中删除特定字符串

Pandas处理dataframe的文本数据列:使用str属性获取数据列的字符串方法类split函数基于指定分隔符拆分数据列的内容为列表设置参数n控制拆分的次数获取所有列表中第一个位置的元素内容