我有一个模式的spark(版本2.4)Dataframe。
+----------+
| ColumnA |
+----------+
| 1000@Cat |
| 1001@Dog |
| 1000@Cat |
| 1001@Dog |
| 1001@Dog |
+----------+
我使用下面的代码有条件地应用regex删除附加到字符串的数字
dataset.withColumn("ColumnA",when(regexp_extract(dataset.col("ColumnA"), "\\@(.*)", 1)
.equalTo(""), dataset.col("ColumnA"))
.otherwise(regexp_extract(dataset.col("ColumnA"), "\\@(.*)", 1)));
这将导致以下格式的Dataframe
+---------+
| ColumnA |
+---------+
| Cat |
| Dog |
| Cat |
| Dog |
| Dog |
+---------+
这将正确运行并产生所需的输出。
但是,regexp\u extract操作应用了两次,一次是检查返回的字符串是否为空,如果不是,则对列重新应用regexp\u extract。
有没有任何优化,可以在这个代码上做,使其更好地执行。?
1条答案
按热度按时间rdlzhqv91#
使用
split
函数而不是regexp_extract
.请检查以下代码与执行时间
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