代码之家  ›  专栏  ›  技术社区  ›  vva

优化spark数据帧操作

  •  0
  • vva  · 技术社区  · 4 年前

    我有一个模式的spark(2.4版)数据框架。

    +----------+
    | ColumnA  |
    +----------+
    | 1000@Cat |
    | 1001@Dog |
    | 1000@Cat |
    | 1001@Dog |
    | 1001@Dog |
    +----------+
    

    我使用下面的代码有条件地应用正则表达式删除附加到字符串中的数字

    dataset.withColumn("ColumnA",when(regexp_extract(dataset.col("ColumnA"), "\\@(.*)", 1)
                                                        .equalTo(""), dataset.col("ColumnA"))
                                                   .otherwise(regexp_extract(dataset.col("ColumnA"), "\\@(.*)", 1)));
    

    这将导致以下格式的数据帧

    +---------+
    | ColumnA |
    +---------+
    | Cat     |
    | Dog     |
    | Cat     |
    | Dog     |
    | Dog     |
    +---------+
    

    这将正确运行并产生所需的输出。

    然而,regexp_extract操作被应用了两次,一次是检查返回的字符串是否为空,如果不是,则在列上重新应用regexp_extract。

    是否有任何优化可以对这段代码进行,使其性能更好。?

    2 回复  |  直到 4 年前
        1
  •  1
  •   s.polam    4 年前

    使用 split 功能而不是 regexp_extract .

    请检查下面的代码和执行时间

    scala> df.show(false)
    +--------+
    |columna |
    +--------+
    |1000@Cat|
    |1001@Dog|
    |1000@Cat|
    |1001@Dog|
    |1001@Dog|
    +--------+
    
    
    scala> spark.time(df.withColumn("parsed",split($"columna","@")(1)).show(false))
    +--------+------+
    |columna |parsed|
    +--------+------+
    |1000@Cat|Cat   |
    |1001@Dog|Dog   |
    |1000@Cat|Cat   |
    |1001@Dog|Dog   |
    |1001@Dog|Dog   |
    +--------+------+
    
    Time taken: 14 ms
    
    scala> spark.time { df.withColumn("ColumnA",when(regexp_extract($"columna", "\\@(.*)", 1).equalTo(""), $"columna").otherwise(regexp_extract($"columna", "\\@(.*)", 1))).show(false) }
    +-------+
    |ColumnA|
    +-------+
    |Cat    |
    |Dog    |
    |Cat    |
    |Dog    |
    |Dog    |
    +-------+
    
    Time taken: 22 ms
    
    scala>
    
    

    contains 用于检查的函数 @ 列中的值

    scala> spark.time(df.withColumn("parsed",when($"columna".contains("@"), lit(split($"columna","@")(1))).otherwise("")).show(false))
    +--------+------+
    |columna |parsed|
    +--------+------+
    |1000@Cat|Cat   |
    |1001@Dog|Dog   |
    |1000@Cat|Cat   |
    |1001@Dog|Dog   |
    |1001@Dog|Dog   |
    +--------+------+
    
    Time taken: 14 ms