我有一個大的DataFrame A,其間隔如下:
df_a = spark.createDataFrame([
(0, 23), (1, 6), (2, 55), (3, 1), (4, 12), (5, 51),
], ("id", "x"))
# --- ---
# | id| x|
# --- ---
# | 0| 23|
# | 1| 6|
# | 2| 55|
# | 3| 1|
# | 4| 12|
# | 5| 51|
# --- ---
并且我有一個Dataframe B,它具有如下排序的非重疊閉合區間:
df_b = spark.createDataFrame([
(0, 1, 5), (1, 8, 10), (2, 15, 16), (3, 20, 30), (4, 50, 52),
], ("id", "start", "end"))
# --- ----- ---
# | id|start|end|
# --- ----- ---
# | 0| 1| 5|
# | 1| 8| 10|
# | 2| 15| 16|
# | 3| 20| 30|
# | 4| 50| 52|
# --- ----- ---
我想檢查 DataFrame A 的值是否包含在 DataFrame B 的間隔之一中,如果是,則將 id 保存在新列 ( interval_id) 中。我的輸出資料幀應該是這樣的:
id x interval_id
0 23 3
1 6 null
2 55 null
3 1 0
4 12 null
5 51 4
有沒有辦法在沒有 udfs 的情況下有效地做到這一點?
uj5u.com熱心網友回復:
簡單left_join應該做的作業:
from pyspark.sql import functions as F
result = df_a.join(
df_b.withColumnRenamed("id", "interval_id"),
F.col("x").between(F.col("start"), F.col("end")),
"left"
).drop("start", "end")
result.show()
# --- --- -----------
#| id| x|interval_id|
# --- --- -----------
#| 0| 23| 3|
#| 1| 6| null|
#| 2| 55| null|
#| 3| 1| 0|
#| 4| 12| null|
#| 5| 51| 4|
# --- --- -----------
uj5u.com熱心網友回復:
你可以join df_a和df_b這樣的df_a["x"] between df_b["start"] and df_b["end"]。
df_a = spark.createDataFrame([
(0, 23), (1, 6), (2, 55), (3, 1), (4, 12), (5, 51),
], ("id", "x"))
df_b = spark.createDataFrame([
(0, 1, 5), (1, 8, 10), (2, 15, 16), (3, 20, 30), (4, 50, 52),
], ("id", "start", "end"))
df_a.join(df_b, df_a["x"].between(df_b["start"], df_b["end"]), how="left")\
.select(df_a["id"], df_a["x"], df_b["id"].alias("interval_id")).show()
輸出
--- --- -----------
| id| x|interval_id|
--- --- -----------
| 0| 23| 3|
| 1| 6| null|
| 2| 55| null|
| 3| 1| 0|
| 4| 12| null|
| 5| 51| 4|
--- --- -----------
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/383928.html
標籤:Python 阿帕奇火花 火花 apache-spark-sql
上一篇:使用left_antispark/pyspark創建資料框
下一篇:將一列考拉串列拆分為多列
