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

yzuktlbb  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(668)

我有一个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”的数组元素,并在Dataframe中添加两列。
因此,上面一个示例行的结果如下所示:

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

最有效的方法是什么?

ljo96ir5

ljo96ir51#

这应该做到:

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  |

# +---------------------------------------------------------------------------------+------+------+------+

相关问题