這是一個簡單的例子
from pyspark.sql.functions import map_values
df = spark.sql("SELECT map('a', 1, 'c', 2, 'b', 3) as data")
df.show(20, False)
df.select(map_values("data").alias("values")).show()

我想要的是以下(按鍵的順序:'a','b','c')

如何做到這一點?此外 - 函式的結果是否map_values始終保持上述順序df.show(),即[1, 2, 3]?
uj5u.com熱心網友回復:
一個選項使用map_keys
from pyspark.sql import functions as F
df = spark.sql("SELECT map('a', 1, 'c', 2, 'b', 3) as data")
df = df.select(
F.transform(F.array_sort(F.map_keys("data")), lambda x: F.col("data")[x]).alias("values")
)
df.show()
# ---------
# | values|
# ---------
# |[1, 3, 2]|
# ---------
uj5u.com熱心網友回復:
的map約定是它為某個鍵提供價值,并且不保留條目排序。保持順序由arrays 提供。
你可以做的是將你的map變成一個arraywithmap_entries函式,然后使用排序條目array_sort,然后使用transform來獲取值。有點復雜,但有效。
with data as (SELECT map('a', 1, 'c', 2, 'b', 3) as m)
select
transform(
array_sort(
map_entries(m),
(left, right) -> case when left.key < right.key then -1 when left.key > right.key then 1 else 0 end
),
e -> e.value
)
from data;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/494575.html
標籤:阿帕奇火花 排序 字典 pyspark apache-spark-sql
上一篇:除錯PySparkudf(使用日期時間的lambda函式)
下一篇:通過比較舊列的值來創建新列
