gpt4 book ai didi

python - PySpark 正则表达式加入

转载 作者:行者123 更新时间:2023-12-04 08:56:16 24 4
gpt4 key购买 nike

我有一个 Pyspark 数据框,它需要与另一个基于字符串列的数据框连接。例如。

(bob1, "a.b.*.c") (bob2, "a.b.c")


当加入

(tom1, "a.b.d.c") (tom2, "a.b.c")


在第二列(模式)上,应该给出:(bob1, tom1) (bob2, tom2)。我知道这可以使用 来完成喜欢 但为此,我需要将模式列转换为实际的正则表达式。所以
  • a.b.*.c 变成 ^a.b.(\w+).c$
  • a.b.c 变成 ^a.b.c$

  • 我在做这个转换时遇到了麻烦。我尝试使用 regex_replace(),但由于输出中有\,它会插入\两次而不是一次。

    最佳答案

    regexp_replace可以使用:

    df1 = spark.createDataFrame([
    ("bob1", "a.b.*.d"),("bob2","a.b.c")], ["col1", "col2"])
    df2 = spark.createDataFrame([
    ("tom1", "a.b.c.d"),("tom2","a.b.c")], ["col3", "col4"])
    df1 = df1.withColumn("join_col", F.concat(F.lit("^"), F.regexp_replace(F.col("col2"), "\\*", "(\\\\w+)"), F.lit("$")))
    df_joined = df1.join(df2, F.expr("col4 rlike join_col"))
    df_joined.show()
    打印
    +----+-------+-------------+----+-------+
    |col1| col2| join_col|col3| col4|
    +----+-------+-------------+----+-------+
    |bob1|a.b.*.d|^a.b.(\w+).d$|tom1|a.b.c.d|
    |bob2| a.b.c| ^a.b.c$|tom2| a.b.c|
    +----+-------+-------------+----+-------+
    \w+周围的括号可以省略。
    不幸的是, df_joined.explain()显示 rlike join 导致笛卡尔积:
    == Physical Plan ==
    CartesianProduct col4#5 RLIKE join_col#26
    :- *(1) Project [col1#0, col2#1, concat(^, regexp_replace(col2#1, \*, (\\w+)), $) AS join_col#26]
    : +- *(1) Filter isnotnull(concat(^, regexp_replace(col2#1, \*, (\\w+)), $))
    : +- *(1) Scan ExistingRDD[col1#0,col2#1]
    +- *(2) Filter isnotnull(col4#5)
    +- *(2) Scan ExistingRDD[col3#4,col4#5]

    关于python - PySpark 正则表达式加入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63818833/

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