问题描述
我有 2 个 pyspark 数据框,我试图将它们加入其中,其中列中的某些值带有括号。 例如,其中一个值是
"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|
+-----------------+-------+-----------+
解决方法
编辑:
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()
,
.rlike()
与 .like()
相同,只是它使用正则表达式。您需要转义括号。尝试这样过滤:
df.filter(col('animal').rlike("Mangy \(Dog\)")).show()
如果没有一些示例数据,我不确定我是否可以帮助解决最初的连接问题。