Apache spark spark数据帧中每行的映射类型列中的按键排序
我有一个spark数据帧,格式如下:Apache spark spark数据帧中每行的映射类型列中的按键排序,apache-spark,dictionary,pyspark,apache-spark-sql,pyspark-dataframes,Apache Spark,Dictionary,Pyspark,Apache Spark Sql,Pyspark Dataframes,我有一个spark数据帧,格式如下: Name LD_Value A37 Map(10 -> 0.20,5 -> 0.30,17 -> 0.25) A39 Map(11 -> 0.40,6 -> 0.67,24 -> 0.45) 我需要根据LD\u Value列中的键对每条记录进行降序排序 预期产出: Name LD_Value A37 Map(17 -> 0.25,10 -> 0.20,5 -> 0.30) A3
Name LD_Value
A37 Map(10 -> 0.20,5 -> 0.30,17 -> 0.25)
A39 Map(11 -> 0.40,6 -> 0.67,24 -> 0.45)
我需要根据LD\u Value
列中的键对每条记录进行降序排序
预期产出:
Name LD_Value
A37 Map(17 -> 0.25,10 -> 0.20,5 -> 0.30)
A39 Map(24 -> 0.45,11 -> 0.40,6 -> 0.67)
是否可以在spark数据框中的映射类型列上进行排序
我研究了spark高阶函数,但运气不好。您可以首先使用
map\u keys
函数获取映射的键,对键数组进行排序,然后使用transform
从原始映射中获取每个键元素的对应值,最后,通过使用map\u from_arrays
函数从两个数组创建一个新的映射来更新映射列
对于Spark 3+,您可以使用比较器函数作为array\u sort
函数的第二个参数,按降序对键数组进行排序:
from pyspark.sql import functions as F
df1 = df.withColumn(
"LD_Value_keys",
F.expr("array_sort(map_keys(LD_Value), (x, y) -> case when x > y then -1 when x < y then 1 else 0 end)")
).withColumn("LD_Value_values", F.expr("transform(LD_Value_keys, x -> LD_Value[x])")) \
.withColumn("LD_Value", F.map_from_arrays(F.col("LD_Value_keys"), F.col("LD_Value_values"))) \
.drop("LD_Value_keys", "LD_Value_values")
df1.show()
#+----+----------------------------------+
#|Name|LD_Value |
#+----+----------------------------------+
#|A37 |[17 -> 0.25, 10 -> 0.2, 5 -> 0.3] |
#|A39 |[24 -> 0.45, 11 -> 0.4, 6 -> 0.67]|
#+----+----------------------------------+
然后像这样使用它:
df.withColumn("LD_Value_keys", array_sort_udf(F.map_keys(F.col("LD_Value")), F.lit(True)))
您可以定义一个UDF函数来对maptype列进行排序。请查看此链接:
df.withColumn("LD_Value_keys", array_sort_udf(F.map_keys(F.col("LD_Value")), F.lit(True)))