如何从火花字符串列中删除所有以“_”开头的字符

How to remove all characters that start with "_" from a spark string column

我正在尝试通过删除该列下所有行的后缀来修改我的 dataFrame 中的列,我在 Scala 中需要它。 列中的值具有不同的长度,并且后缀也不同。 例如,我有以下值:

09E9894DB868B70EC3B55AFB49975390-0_0_0_0_0
0978C74C69E8D559A62F860EA36ADF5E-28_3_1
0C12FA1DAFA8BCD95E34EE70E0D71D10-0_3_1
0D075AA40CFC244E4B0846FA53681B4D_0_1_0_1
22AEA8C8D403643111B781FE31B047E3-0_1_0_0

我需要删除“_”后的所有内容,以便获得以下值:

09E9894DB868B70EC3B55AFB49975390-0
0978C74C69E8D559A62F860EA36ADF5E-28
0C12FA1DAFA8BCD95E34EE70E0D71D10-0
0D075AA40CFC244E4B0846FA53681B4D
22AEA8C8D403643111B781FE31B047E3-0

正如@werner 在他的评论中指出的那样,substring_index 提供了一个简单的解决方案。没有必要将其包装在对 selectExpr.

的调用中

虽然@AminMal 提供了一个使用 UDF 的工作解决方案,但如果可以使用本机 Spark 函数,那么这对于性能来说是更可取的。[1]

val df = List(
    "09E9894DB868B70EC3B55AFB49975390-0_0_0_0_0",
    "0978C74C69E8D559A62F860EA36ADF5E-28_3_1",
    "0C12FA1DAFA8BCD95E34EE70E0D71D10-0_3_1",
    "0D075AA40CFC244E4B0846FA53681B4D_0_1_0_1",
    "22AEA8C8D403643111B781FE31B047E3-0_1_0_0"
).toDF("col0")

import org.apache.spark.sql.functions.{col, substring_index}

df
  .withColumn("col0", substring_index(col("col0"), "_", 1))
  .show(false)

给出:

+-----------------------------------+
|col0                               |
+-----------------------------------+
|09E9894DB868B70EC3B55AFB49975390-0 |
|0978C74C69E8D559A62F860EA36ADF5E-28|
|0C12FA1DAFA8BCD95E34EE70E0D71D10-0 |
|0D075AA40CFC244E4B0846FA53681B4D   |
|22AEA8C8D403643111B781FE31B047E3-0 |
+-----------------------------------+


[1]