代码之家  ›  专栏  ›  技术社区  ›  Mimi Müller

带pyspark的regex

  •  0
  • Mimi Müller  · 技术社区  · 7 年前

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

    |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 `^`
    

    为什么不采用正则表达式?

    1 回复  |  直到 7 年前
        1
  •  0
  •   Ala Tarighati    7 年前

    如果要创建 旗帜 列,您可以尝试 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)