从Scala中的DataFrame修剪前导0

阿布萨卜

我有一个数据框:

 | subcategory | subcategory_label | category  |
 | 00EEE       | 00EEE FFF         | Drink     |
 | 0000EEE     | 00EEE FFF         | Fruit     |
 | 0EEE        | 000EEE FFF        | Meat      |

从中,我需要从Dataframe的列中删除前导0,并需要这样的结果

| subcategory | subcategory_label | category  |
| EEE         | EEE FFF           | Drink     |
| EEE         | EEE FFF           | Fruit     |
| EEE         | EEE FFF           | Meat      |

到目前为止,我可以使用以下命令从一列中删除前导0

df.withColumn("subcategory ", regexp_replace(df("subcategory "), "^0*", "")).show

如何一次性删除数据帧中的前导0?

vert

以此作为提供的数据框:

+-----------+-----------------+--------+
|subcategory|subcategory_label|category|
+-----------+-----------------+--------+
|0000FFFF   |0000EE 000FF     |ABC     |
+-----------+-----------------+--------+

您可以regexp_replace为所有列创建一个就像是 :

val regex_all = df.columns.map( c => regexp_replace(col(c), "^0*", "" ).as(c) )

然后使用,select因为它需要一个类型为varargs的变量Column

df.select(regex_all :_* ).show(false)
+-----------+-----------------+--------+
|subcategory|subcategory_label|category|
+-----------+-----------------+--------+
|FFFF       |EE 000FF         |ABC     |
+-----------+-----------------+--------+

编辑:

定义一个函数来返回regexp_replaced序列很简单:

/**
  * @param origCols total cols in the DF, pass `df.columns`
  * @param replacedCols `Seq` of columns for which expression is to be generated
  * @return `Seq[org.apache.spark.sql.Column]` Spark SQL expression
  */
def createRegexReplaceZeroes(origCols : Seq[String], replacedCols: Seq[String] ) = {
    origCols.map{ c => 
        if(replacedCols.contains(c)) regexp_replace(col(c), "^0*", "" ).as(c) 
        else col(c)
    }
}

此函数将返回一个 Array[org.apache.spark.sql.Column]

现在,将要替换的列存储在Array中:

val removeZeroes = Array( "subcategory", "subcategory_label" )

并且,然后使用removeZeroes作为参数调用该函数这将返回在中regexp_replace可用列语句removeZeroes

df.select( createRegexReplaceZeroes(df.columns, removeZeroes) :_* )

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章