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