【问题标题】:Regex with pyspark带有 pyspark 的正则表达式
【发布时间】:2018-07-31 22:42:41
【问题描述】:

我对 pyspark 很陌生,所以这是一个非常基本的问题: 所以我有一个看起来像这样的数据框:

|I  27-May-18 10:1...|false|
|I  27-May-18 10:1...|false|
|I  27-May-18 10:1...|false|
|I  27-May-18 10:1...|false|
|I  27-May-18 10:1...|false|
|W  27-May-18 10:1...|false|
|                 ...|false| ##this one should not be flagged
|W  27-May-18 10:1...|false|

如果开头没有 W 或 I 或 E 或 U 我想将以下所有行连接在一起,那么它应该看起来像这样:

|I  27-May-18 10:1...|false|
|I  27-May-18 10:1...|false|    
|I  27-May-18 10:1...|false|    
|I  27-May-18 10:1...|false|    
|I  27-May-18 10:1...|false|    
|W  27-May-18 10:1......|false| ##the row after this one was joined to the one before    
|W  27-May-18 10:1...|false|

为此,我认为我标记了行,以某种方式将组分配给行,然后使用 group by 语句。

但是我已经卡在标记行上,因为正则表达式不起作用:

所以它的正则表达式是:'^[EUWI]\s'

当我在 pyspark 中使用它时,它会返回所有错误...

这里是代码:

df_with_x5 = a_7_df.withColumn("x5", a_7_df.line.startswith("[EUWI]\s"))
##I am using start with thats why i can drop the `^`

为什么它不接受我的正则表达式?

【问题讨论】:

  • 它不起作用,因为.startswith 不接受正则表达式。
  • 谢谢... 是一个不错的选择,至少它可以工作
  • 是的,rlike 接受正则表达式。它还允许部分匹配。
  • 你知道现在如何将每个真行和以下假行匹配一个唯一的数字吗?
  • @MimiMüller 请阅读how to create good reproducible apache spark dataframe examples 并尝试更详细地解释您想要的输出是什么以及实现它的逻辑是什么。

标签: python regex pyspark


【解决方案1】:

如果你想创建一个flag列,你可以试试substring

import pyspark.sql.functions as F

df=df.withColumn('flag', F.substring(df.columnName,1,1).isin(['W', 'I', 'E', 'U'])

它只检查第一个字母。

但你可以放弃创建新列,直接filter行:

df=df.filter(F.substring(df.columnName,1,1).isin(['W', 'I', 'E', 'U']==False)

【讨论】:

    猜你喜欢
    • 2021-07-11
    • 2019-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-24
    • 1970-01-01
    • 2017-11-14
    • 1970-01-01
    相关资源
    最近更新 更多