[英]How to sort only one column within a spark dataframe using pyspark?
我有一個像這樣的 Spark 數據框:
| time | col1 | col2 |
|----------------------|
| 123456 | 2 | A |
| 123457 | 4 | B |
| 123458 | 7 | C |
| 123459 | 5 | D |
| 123460 | 3 | E |
| 123461 | 1 | F |
| 123462 | 9 | G |
| 123463 | 8 | H |
| 123464 | 6 | I |
現在我需要對“col1” - 列進行排序,但其他列必須保持相同的順序:(使用 pyspark)
| time | col1 | col2 | col1_sorted |
|-----------------------------------|
| same | same | same | sorted |
|-----------------------------------|
| 123456 | 2 | A | 1 |
| 123457 | 4 | B | 2 |
| 123458 | 7 | C | 3 |
| 123459 | 5 | D | 4 |
| 123460 | 3 | E | 5 |
| 123461 | 1 | F | 6 |
| 123462 | 9 | G | 7 |
| 123463 | 8 | H | 8 |
| 123464 | 6 | I | 9 |
在此先感謝您的幫助!
對於Spark 2.3.1 ,您可以嘗試pandas_udf ,見下文(假設原始數據幀按time
列排序)
from pyspark.sql.functions import pandas_udf, PandasUDFType
from pyspark.sql.types import StructType
schema = StructType.fromJson(df.schema.jsonValue()).add('col1_sorted', 'integer')
@pandas_udf(schema, PandasUDFType.GROUPED_MAP)
def get_col1_sorted(pdf):
return pdf.sort_values(['time']).assign(col1_sorted=sorted(pdf["col1"]))
df.groupby().apply(get_col1_sorted).show()
+------+----+----+-----------+
| time|col1|col2|col1_sorted|
+------+----+----+-----------+
|123456| 2| A| 1|
|123457| 4| B| 2|
|123458| 7| C| 3|
|123459| 5| D| 4|
|123460| 3| E| 5|
|123461| 1| F| 6|
|123462| 9| G| 7|
|123463| 8| H| 8|
|123464| 6| I| 9|
+------+----+----+-----------+
假設 df 是具有實際值的數據幀:
import copy
df_schema = copy.deepcopy(df.schema)
new_df = X.rdd.zipWithIndex().toDF(df_schema)
new_df = new_df.orderBy("col1")
df = df.withColumn("col1_sorted", new_df["col1"])
df.show()
我自己的解決方案如下:
首先使用 col1 選擇並按 col1 排序的 df 副本:
df_copy = df.select("col1").orderBy("col1")
第二個索引兩個數據幀:(df_copy 相同,僅使用窗口 orderBy("col1"))
w = Window.orderBy("time").rowsBetween(-sys.maxsize, 0)
df = df\
.withColumn("helper", lit(1))\
.withColumn("index", lit(0))\
.withColumn("index", F.col("index")+F.sum(F.col("helper")).over(w))
最后一步,將 col1 重命名為 col1_sorted 並加入數據幀
df_copy = df_copy.withColumnRenamed("col1", "col1_sorted")
df = df.join(df_copy, df.index == df_copy.index, how="inner")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.