我有一個這樣的資料框架,
我有一個這樣的資料框架。
scala> df.printSchema
根
|-- Protocol ID: decimal(12,0) (nullable = true)
|-- Protocol #: string (nullable = true)
|-- Eudract #: string (nullable = true)
|-- STDY_MIGRATED_INDC: string (nullable = true)
|-- # Non-US Count: 十進制(7,0) (nullable = true)
|-- # US Count: decimal(7,0) (nullable = true)
這里的資料列中有空格和特殊字符。我想用下劃線來代替它,就像這樣,
這里的資料列有空格和特殊字符。
scala> newdf.printSchema
根
|-- Protocol_ID: decimal(12,0) (nullable = true)
|-- Protocol: string (nullable = true)
|-- Eudract: string (nullable = true)
|-- STDY_MIGRATED_INDC: string (nullable = true)
|-- Non-US_Count: 十進制(7,0) (nullable = true)
|-- US_Count: 十進制(7,0) (nullable = true)
所以我用了下面的步驟,
我用了下面的方法
val df=spark.read.format("parquet"/span>).load("<s3 path>")
val regex_string=""[ ._(),!#$%& "*./:;<->] ""
val replacingColumns = df.columns.map(regex_string.r.replaceAllIn(_, "_"/span>)
val resultDF = replacingColumns.zip(df.columns).foldLeft(df){
(tempdf, name) => tempdf.withColumnRenamed(name._2, name._1)
}
resultDF.printSchema
但是我得到的df是這樣的。
scala> resultDF.printSchema
根
|-- Protocol_ID: decimal(12,0) (nullable = true)
|-- Protocol_: string (nullable = true)
|-- Eudract_: string (nullable = true)
|-- STDY_MIGRATED_INDC: string (nullable = true)
|-- _Non-US_Count: 十進制(7,0) (nullable = true)
|-- _US_Count: 十進制(7,0) (nullable = true)
如果空格或特殊字符在開頭或結尾,那么我不想要下劃線。 在Python中,我可以使用,
starts_with = [i.replace("_"/span>,""/span>,1) if i.startswith("_") else i for i in df.columns]
[(i[::-1].replace("_",",1) [::-1] if i.endswith("_") else i for i in starts_with ]
由于我是scala的新手,我不確定如何解決這個問題。希望得到任何幫助。
uj5u.com熱心網友回復:
你可以使用(^_|_$)重碼來替換開頭或結尾的_為空字串。
val regex_string = ""[ ._(),!#$%& "*./:;<-> ] ""
val col = regex_string.r.replaceAllIn("#Non-US Count##"/span>, "_")
println(col)
println("(^_|_$)"/span>.r.replaceAllIn(col, "")
//_Non-US_Count_。
// Non-US_Count
val replacingColumns = df.columns.map(s=>"(^_|_$)"。 r.replaceAllIn(regex_string.r.replaceAllIn(s, "_"),"")
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/309118.html
標籤:
