gpt4 book ai didi

pyspark - 在子字符串匹配(或包含)上加入 PySpark 数据帧

转载 作者:行者123 更新时间:2023-12-04 16:07:59 27 4
gpt4 key购买 nike

我想在两个数据帧之间执行左连接,但列不完全匹配。第一个数据帧中的连接列相对于第二个数据帧有一个额外的后缀。

from pyspark import SparkContext
import pyspark.sql.functions as f

sc = SparkContext()

df1 = sc.parallelize([
['AB-101-1', 'el1', 1.5],
['ABC-1020-1', 'el2', 1.3],
['AC-1030-1', 'el3', 8.5]
]).toDF(('id1', 'el', 'v1'))

df2 = sc.parallelize([
['AB-101', 3],
['ABC-1020', 4]
]).toDF(('id2', 'v2'))

作为左连接的结果,我想获得的数据框是:
df_join = sc.parallelize([
['AB-101-1', 'el1', 1.5, 'AB-101', 3],
['ABC-1020-1', 'el2', 1.3, 'ABC-1020', 4],
['AC-103-1', 'el3', 8.5, None, None]
]).toDF(('id1', 'el', 'v1', 'id2', 'v2'))

我很乐意使用 pyspark.sql.substring取“除最后 2 个字符外的所有字符”,或使用类似 pyspark.sql.like 的内容,但我不知道如何使这两者在连接中正常工作。

最佳答案

id1 & id2有一些类似于您在问题中说明的模式,那么我建议采用以下方法。

from pyspark.sql.functions import regexp_extract

df1 = sc.parallelize([
['AB-101-1', 'el1', 1.5],
['ABC-1020-1', 'el2', 1.3],
['AC-1030-1', 'el3', 8.5]
]).toDF(('id1', 'el', 'v1'))

df2 = sc.parallelize([
['AB-101', 3],
['ABC-1020', 4]
]).toDF(('id2', 'v2'))

df1 = df1.withColumn("id1_transformed", regexp_extract('id1', '(.*-.*)(-.*)', 1))

df_join = df1.join(df2, df1.id1_transformed==df2.id2, 'left').drop("id1_transformed")
df_join.show()

输出是:
+----------+---+---+--------+----+
| id1| el| v1| id2| v2|
+----------+---+---+--------+----+
|ABC-1020-1|el2|1.3|ABC-1020| 4|
| AB-101-1|el1|1.5| AB-101| 3|
| AC-1030-1|el3|8.5| null|null|
+----------+---+---+--------+----+

希望这可以帮助!

关于pyspark - 在子字符串匹配(或包含)上加入 PySpark 数据帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45551417/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com