优化Spark数据框操作

我有该模式的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。

有什么可以优化此代码以使其性能更好的代码吗?

评论
雪

Compute new column using regexp_extract then use when otherwise on the column.

//sample dataframe
df.show()
//+--------+
//| ColumnA|
//+--------+
//|1000@Cat|
//|1001@Dog|
//|   1002@|
//+--------+

df.withColumn("extract",regexp_extract(col("ColumnA"), "\\@(.*)", 1)).
withColumn("ColumnA",when(col("extract").equalTo(""), col("ColumnA")).otherwise(col("extract"))).
drop("extract").
show()
//+-------+
//|ColumnA|
//+-------+
//|    Cat|
//|    Dog|
//|  1002@|
//+-------+
点赞
评论
fharum
fharum

Use split function instead of 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>

点赞
评论