You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PySpark中如何通过指定位置的子字符串关联两个DataFrame

PySpark中如何通过指定位置的子字符串关联两个DataFrame

嗨,我来帮你搞定这个关联需求!要实现通过指定位置的子串关联两个单列DataFrame,我们可以利用PySpark的substr函数先提取出用于匹配的关键子串,再基于这个子串完成关联操作。下面是具体的实现步骤和两种可选方案:

方案一:先添加临时关联键列再关联

这种方式逻辑清晰,适合需要保留关联键用于后续操作的场景:

  1. 首先创建示例DataFrame(对应你给出的df1和df2):
from pyspark.sql import SparkSession
from pyspark.sql.functions import col, substr

# 初始化SparkSession
spark = SparkSession.builder.appName("SubstringJoinExample").getOrCreate()

# 构建df1
data1 = [("A234568ABC",), ("A345636XYZ",)]
df1 = spark.createDataFrame(data1, ["col1"])

# 构建df2
data2 = [("B2345ABC890",), ("B3412XYZ456",)]
df2 = spark.createDataFrame(data2, ["col2"])
  1. 提取指定位置的子串作为关联键:
    这里要注意PySpark的substr函数参数是**(起始位置, 长度)**,所以:
  • df1需要取第8到10位,起始位置是8,长度为3(10-8+1)
  • df2需要取第6到8位,起始位置是6,长度为3
# 给df1添加关联键列
df1_with_key = df1.withColumn("join_key", substr(col("col1"), 8, 3))
# 给df2添加关联键列
df2_with_key = df2.withColumn("join_key", substr(col("col2"), 6, 3))
  1. 基于关联键进行关联:
    这里用inner join作为示例,你可以根据实际需求换成left/right/full join:
# 执行关联
joined_df = df1_with_key.join(df2_with_key, on="join_key", how="inner")

# 如果不需要保留临时的关联键列,可以直接删除
final_df = joined_df.drop("join_key")

# 查看结果
final_df.show()

方案二:直接在关联条件中使用子串(更简洁)

如果不需要保留关联键,你可以直接在join的条件里调用substr,省去临时列的创建:

# 直接在join条件中匹配子串
joined_df = df1.join(
    df2,
    substr(col("col1"), 8, 3) == substr(col("col2"), 6, 3),
    how="inner"
)

# 查看结果
joined_df.show()

两种方案最终都会得到你想要的关联结果:df1中"A234568ABC"的子串"ABC"会和df2中"B2345ABC890"的子串"ABC"匹配,df1中"A345636XYZ"的子串"XYZ"会和df2中"B3412XYZ456"的子串"XYZ"匹配。

备注:内容来源于stack exchange,提问作者Matthew

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.20 09:43:01