在列中的一些值有括号的情况下,我尝试加入的有2个。例如,其中一个值是
"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个数据格式,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)我希望输出数据是这样的:
+-----------------+-------+-----------+
| animal| origin|destination|
+-----------------+-------+-----------+
| mangy (dog)|Streets| House|
| Cat| house| Streets|
|[Bumbling] Bufoon| Utopia| Circus|
| Cheetah| Congo| Zoo|
|(Sprawling) Snake| Amazon| Glass Box|
+-----------------+-------+-----------+发布于 2021-03-19 08:33:17
编辑:
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。例如,你可以
df1.join(df2, expr("df1.animal like concat('%', df2.animal_stat, '%')"))若要执行筛选,您可以尝试
df.filter(col('animal').like("%Mangy (Dog)%")).show()发布于 2021-03-19 04:08:45
.rlike()与.like()相同,但它使用regex。你需要转义括号。尝试像这样进行过滤:
df.filter(col('animal').rlike("Mangy \(Dog\)")).show()不确定我是否可以在没有一些示例数据的情况下帮助解决最初的联接问题。
https://stackoverflow.com/questions/66702047
复制相似问题