优化sparkDataframe操作

k2fxgqgv  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(459)

我有一个模式的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。
有没有任何优化,可以在这个代码上做,使其更好地执行。?

rdlzhqv9

rdlzhqv91#

使用 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

相关问题