PySpark中如何通过指定位置的子字符串关联两个DataFrame
PySpark中如何通过指定位置的子字符串关联两个DataFrame
嗨,我来帮你搞定这个关联需求!要实现通过指定位置的子串关联两个单列DataFrame,我们可以利用PySpark的substr函数先提取出用于匹配的关键子串,再基于这个子串完成关联操作。下面是具体的实现步骤和两种可选方案:
方案一:先添加临时关联键列再关联
这种方式逻辑清晰,适合需要保留关联键用于后续操作的场景:
- 首先创建示例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"])
- 提取指定位置的子串作为关联键:
这里要注意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))
- 基于关联键进行关联:
这里用innerjoin作为示例,你可以根据实际需求换成left/right/fulljoin:
# 执行关联 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
相关产品推荐
相关产品推荐

