在pyspark中使用rlike连接Dataframe时包含括号

fjnneemd  于 2021-07-14  发布在  Spark
关注(0)|答案(2)|浏览(490)

我有2个pysparkDataframe,我正在尝试连接其中列中的一些值有括号。例如,其中一个值是

"Mangy (Dog)"

如果我试着这样加入:

df1.join(df2 expr("df1.animal rlike df2.animal_stat")

我没有任何结果。所以我试着用 rlike 只是想看看我是否能捕捉到这些价值观。
过滤作用于除带括号的值以外的所有值。例如,当我尝试这样过滤时:

df.filter(col('animal').rlike("Mangy (Dog)")).show()

我没有任何结果。
但是,如果我用 rlike("Mangy") 或者 rlike("(Dog)" 好像有用。即使我在 (Dog) .
有没有办法让rlike在匹配项中包含括号?
编辑:我有2个Dataframe df1 以及 df2 像这样:

+-----------------+-------+
|           animal| origin|
+-----------------+-------+
|      mangy (dog)|Streets|
|              Cat|  house|
|[Bumbling] Bufoon| Utopia|
|          Cheetah|  Congo|
|(Sprawling) Snake| Amazon|
+-----------------+-------+

+-------------------+-----------+
|        animal_stat|destination|
+-------------------+-----------+
|              ^dog$|      House|
|              ^Cat$|    Streets|
|^[Bumbling] Bufoon$|     Circus|
|          ^Cheetah$|        Zoo|
|      ^(Sprawling)$|  Glass Box|
+-------------------+-----------+

我正试着用 rlike 使用以下方法:

dff1=df1.alias('dff1')
dff2=df2.alias('dff2')

combine=dff1.join(dff2, expr("dff1.animal rlike dff2.animal_stat"), how='left')
.drop(dff2.animal_stat)

我希望输出Dataframe如下:

+-----------------+-------+-----------+
|           animal| origin|destination|
+-----------------+-------+-----------+
|      mangy (dog)|Streets|      House|
|              Cat|  house|    Streets|
|[Bumbling] Bufoon| Utopia|     Circus|
|          Cheetah|  Congo|        Zoo|
|(Sprawling) Snake| Amazon|  Glass Box|
+-----------------+-------+-----------+
wfauudbj

wfauudbj1#

编辑:

combine = df1.alias('df1').join(
    df2.withColumn('animal_stat', F.regexp_replace(F.regexp_replace(F.regexp_replace(F.regexp_replace('animal_stat', '\\(', '\\\\('), '\\)', '\\\\)'), '\\[', '\\\\['), '\\]', '\\\\]')).alias('df2'), 
    F.expr('df1.animal rlike df2.animal_stat'),
    'left'
)

如果您没有使用任何正则表达式,那么您可能希望使用 like 而不是 rlike . 例如,你可以

df1.join(df2, expr("df1.animal like concat('%', df2.animal_stat, '%')"))

要做过滤器,你可以试试

df.filter(col('animal').like("%Mangy (Dog)%")).show()
m528fe3b

m528fe3b2#

.rlike() 与相同 .like() 但它使用正则表达式。你需要对括号进行转义。尝试如下过滤:

df.filter(col('animal').rlike("Mangy \(Dog\)")).show()

如果没有一些示例数据,我不确定是否可以帮助解决原始连接问题。

相关问题