我正在嘗試通過從該列下的所有行中洗掉后綴來修改我的 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
uj5u.com熱心網友回復:
正如@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]撰寫 spark UDF 時是否存在性能損失
uj5u.com熱心網友回復:
您可以使用用戶定義的函式來執行操作:
val beforeUnderscore: String => String = original => original.takeWhile(_ != '_')
spark.udf.register("before_underscore", beforeUnderscore)
// and then in your query expression
df.select(expr("before_underscore(COLUMN_NAME)"))
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/455959.html
