自定义订单pyspark Dataframe 分配列

iqih9akk  于 2023-02-11  发布在  Spark
关注(0)|答案(1)|浏览(162)

我有一个pyspark Dataframe df
我想按此顺序基于Type列按比例分配项目:AAIC〉AAFC〉TBIC〉TBFC,其中使用RANK列,即在上述订单组中具有较低优先级的项目。Type列中除AAIC或AAFC TBIC或TBFC之外的任何值,我希望将其重新标记为NON
| 项目|类型|等级|
| - ------|- ------|- ------|
| 1个|AAIC公司|十一|
| 第二章|亚洲足球联合会|八个|
| 三个|TBIC公司|第二章|
| 四个|TBFC|1个|
| 五个|XYZ|五个|
| 六个|AAIC公司|七|
| 七|香港赛马会|十个|
| 八个|软件工程|三个|
| 九|TBIC公司|四个|
| 十个|亚洲足球联合会|九|
| 十一|亚洲足球联合会|六个|
所需的pyspark Dataframe df:-
| 项目|类型|等级|新等级|
| - ------|- ------|- ------|- ------|
| 六个|AAIC公司|七|1个|
| 1个|AAIC公司|十一|第二章|
| 十一|亚洲足球联合会|六个|三个|
| 第二章|亚洲足球联合会|八个|四个|
| 十个|亚洲足球联合会|九|五个|
| 三个|TBIC公司|第二章|六个|
| 九|TBIC公司|四个|七|
| 四个|TBFC|1个|八个|
| 八个|无|三个|九|
| 五个|无|五个|十个|
| 七|无|十个|十一|

k10s72fa

k10s72fa1#

您可以检查此代码:

import pyspark.sql.functions as F
from pyspark.sql import Window

inputData = [
    (1, "AAIC", 11),
    (2, "AAFC", 8),
    (3, "TBIC", 2),
    (4, "TBFC", 1),
    (5, "XYZ", 5),
    (6, "AAIC", 7),
    (7, "JHK", 10),
    (8, "SWE", 3),
    (9, "TBIC", 4),
    (10, "AAFC", 9),
    (11, "AAFC", 6),
]
inputDf = spark.createDataFrame(inputData, schema=["item", "type", "rank"])

preprocessedDf = inputDf.withColumn(
    "type",
    F.when(
        F.col("type").isin(["AAIC", "AAFC", "TBIC", "TBFC"]), F.col("type")
    ).otherwise(F.lit("NON")),
).withColumn(
    "priority",
    F.when(F.col("type") == F.lit("AAIC"), 1).otherwise(
        F.when(F.col("type") == F.lit("AAFC"), 2).otherwise(
            F.when(F.col("type") == F.lit("TBIC"), 3).otherwise(
                F.when(F.col("type") == F.lit("TBFC"), 4).otherwise(F.lit(5))
            )
        )
    ),
)

windowSpec = Window.partitionBy().orderBy("priority", "rank")

preprocessedDf.withColumn("NEW_RANK", F.row_number().over(windowSpec)).drop(
    "priority"
).show()

编码的优先级是硬编码的,如果值比较多,可能会很难维护,如果需要更灵活的话,可以调整这部分
我将所有记录移动到一个分区以计算正确的row_order。这是一个常见问题,很难以分布式方式计算具有给定顺序的一致id。如果您的数据集很大,则可能需要考虑其他问题,可能会更复杂
输出:

+----+----+----+--------+
|item|type|rank|NEW_RANK|
+----+----+----+--------+
|   6|AAIC|   7|       1|
|   1|AAIC|  11|       2|
|  11|AAFC|   6|       3|
|   2|AAFC|   8|       4|
|  10|AAFC|   9|       5|
|   3|TBIC|   2|       6|
|   9|TBIC|   4|       7|
|   4|TBFC|   1|       8|
|   8| NON|   3|       9|
|   5| NON|   5|      10|
|   7| NON|  10|      11|
+----+----+----+--------+

相关问题