首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在使用rlike连接数据格式时包括括号

在使用rlike连接数据格式时包括括号
EN

Stack Overflow用户
提问于 2021-03-19 03:15:01
回答 2查看 374关注 0票数 0

在列中的一些值有括号的情况下,我尝试加入的有2个。例如,其中一个值是

代码语言:javascript
复制
"Mangy (Dog)"

如果我试着像这样加入:

代码语言:javascript
复制
df1.join(df2 expr("df1.animal rlike df2.animal_stat")

我没有得到任何结果。因此,我尝试使用rlike进行过滤,以查看是否能够捕获这些值。

除带括号的值外,筛选对所有值都有效。例如,当我试图像这样过滤时:

代码语言:javascript
复制
df.filter(col('animal').rlike("Mangy (Dog)")).show()

我没有得到任何结果。

但是,如果我使用rlike("Mangy")rlike("(Dog)"进行筛选,它似乎是有效的。尽管我在(Dog)中指定了括号。

是否有办法使rlike在其匹配项中包括括号?

编辑:,我有2个数据格式,df1df2,如下所示:

代码语言:javascript
复制
+-----------------+-------+
|           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将两者连接起来:

代码语言:javascript
复制
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)

我希望输出数据是这样的:

代码语言:javascript
复制
+-----------------+-------+-----------+
|           animal| origin|destination|
+-----------------+-------+-----------+
|      mangy (dog)|Streets|      House|
|              Cat|  house|    Streets|
|[Bumbling] Bufoon| Utopia|     Circus|
|          Cheetah|  Congo|        Zoo|
|(Sprawling) Snake| Amazon|  Glass Box|
+-----------------+-------+-----------+
EN

回答 2

Stack Overflow用户

发布于 2021-03-19 08:33:17

编辑:

代码语言:javascript
复制
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'
)

如果您没有使用任何regex,您可能希望使用like而不是rlike。例如,你可以

代码语言:javascript
复制
df1.join(df2, expr("df1.animal like concat('%', df2.animal_stat, '%')"))

若要执行筛选,您可以尝试

代码语言:javascript
复制
df.filter(col('animal').like("%Mangy (Dog)%")).show()
票数 2
EN

Stack Overflow用户

发布于 2021-03-19 04:08:45

.rlike().like()相同,但它使用regex。你需要转义括号。尝试像这样进行过滤:

代码语言:javascript
复制
df.filter(col('animal').rlike("Mangy \(Dog\)")).show()

不确定我是否可以在没有一些示例数据的情况下帮助解决最初的联接问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66702047

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档