我有一个验证/数据清理十进制字段的任务我正在创建文件作为数据框并传递十进制列以进行验证。
SAMPLEINPUTCOLUMN
0.1
NA
123-
.54
Null
text123test
3453$
test123.49
EXPECTEDOUTPUT
0.1
0
-123
0.54
0
123
3453
123.49
object decimalfieldvalidation {
def main(args: Array[String]): Unit = {
Logger.getLogger("org").setLevel(Level.ERROR)
val spark = SparkSession.builder.master("local[*]").appName("Decimal Field Validation").getOrCreate()
val sourcefile = spark.read.textFile("C:/Users/phadpa01/Desktop/InputFiles/decimal.csv").filter(!_.isEmpty).toDF("DECIMALFIELD")
val updatedDf = sourcefile.withColumn("DECIMALFIELD", regexp_replace(col("DECIMALFIELD"), "#N/A", "0"))
val updatedDf1 = updatedDf.withColumn("DECIMALFIELD", regexp_replace(col("DECIMALFIELD"), "NA", "0"))
}
}
我正在单独替换每个值。请帮助我。
此致
Pravin
答案 0 :(得分:2)
我假设您知道如何阅读textfile
并将其转换为dataframe
正如OP
中所述,您column
中有dataframe
+-----------------+
|SAMPLEINPUTCOLUMN|
+-----------------+
|0.1 |
|NA |
|123- |
|.54 |
|Null |
|text123test |
|3453$ |
|test123.49 |
+-----------------+
您正试图validate
decimals
并在column
中提取它们。如果这是必需条件,那么简单的udf
函数就可以解决您的问题。
将udf
函数定义为
def regexp_replace = udf((value: String) => {
val decimal = value.replaceAll("[A-Za-z$]", "")
if(decimal.isEmpty){
0.toDouble
}
else{
if(decimal.last.equals('-')){
-decimal.replaceAll("[-]", "").toDouble
}
else {
decimal.toDouble
}
}
})
现在,您只需使用udf
withColumn
函数即可
dataframe.withColumn("SAMPLEINPUTCOLUMN", regexp_replace(col("SAMPLEINPUTCOLUMN"))).show(false)
您将获得以下输出
+-----------------+
|SAMPLEINPUTCOLUMN|
+-----------------+
|0.1 |
|0.0 |
|-123.0 |
|0.54 |
|0.0 |
|123.0 |
|3453.0 |
|123.49 |
+-----------------+
我想这就是所需要的。