我有以下資料幀(稱之為dfTest):
| 物品 | 位置 | 價值 |
|---|---|---|
| 一種 | 1 | 8 |
| 乙 | 2 | 9 |
| C | 3 | 10 |
| d | 4 | 7 |
| 電子 | 5 | 9 |
我想要做的是,在給定距離限制的情況下1,找出value距離(由position列定義)item不大于的行子集中每一行的排名索引(按降序排序)1。
例如,所需的輸出(稱之為dfResult)應該是:
| 物品 | 位置 | 價值 | 秩 |
|---|---|---|---|
| 一種 | 1 | 8 | 2 |
| 乙 | 2 | 9 | 2 |
| C | 3 | 10 | 1 |
| d | 4 | 7 | 3 |
| 電子 | 5 | 9 | 1 |
解釋:
- 為
a行。由于b是唯一item的距離 toa<= 1 (abs(2-1)=1),所以valueis[9,8]和a's的排序子集按順序排value在第二位,因此rankofa是 2。 - 為
b行。這里,aandc是item距離b<= 1的 s ,valueis[10,9,8]and的排序子集按順序是第二個,因此of是 2。bvaluerankb - 為
c行。這里,bandd是item距離c<= 1的 s ,valueis[10,9,7]and的排序子集按順序是第一,因此of是 1。cvaluerankc - ...
感謝 Spark SQL、Scala 或 PySpark 中的任何解決方案!
uj5u.com熱心網友回復:
您可以使用自連接來確定整個表中的相關專案(例如,如果您有f一個位置2也為 的專案,a的排名可能會改變)和rank視窗函式來實作您想要的排名。
下面包括使用 spark-sql、pyspark 和 scala 的示例:
使用 spark-sql
SELECT
d.item,
d.position,
d.value,
d.rank
FROM (
SELECT
i1.*,
i2.item as other_item,
RANK() OVER (
PARTITION BY i1.item
ORDER BY i2.value DESC
) as rank
FROM
dfTest i1
INNER JOIN
dfTest i2 ON ABS(i1.position-i2.position)<=1
) d
WHERE item=other_item;
在 db-fiddle 上查看作業演示
使用 pyspark API
from pyspark.sql import functions as F
from pyspark.sql import Window
dfResult = (
dfTest.alias("i1")
.join(
dfTest.alias("i2"),
F.abs(
F.col("i1.position")-F.col("i2.position")
) <=1,
"inner"
)
.withColumn(
"rank",
F.rank().over(
Window.partitionBy("i1.item").orderBy(F.col("i2.value").desc())
)
)
.where(F.col("i1.item")==F.col("i2.item"))
.select("i1.*","rank")
)
使用 Scala
val dfResult =
dfTest.alias("i1")
.join(
dfTest.alias("i2"),
abs(
col("i1.position")-col("i2.position")
) <=1,
"inner"
)
.withColumn(
"rank",
rank().over(
Window.partitionBy("i1.item").orderBy(col("i2.value").desc())
)
)
.where(col("i1.item")==col("i2.item"))
.select("i1.*","rank")
輸出
dfResult.show(truncate=False)
---- -------- ----- ----
|item|position|value|rank|
---- -------- ----- ----
| a| 1| 8| 2|
| b| 2| 9| 2|
| c| 3| 10| 1|
| d| 4| 7| 3|
| e| 5| 9| 1|
---- -------- ----- ----
讓我知道這是否適合您。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/327831.html
