使用Scala进行十进制字段数据验证

时间:2017-06-01 04:51:57

标签: scala apache-spark

我有一个验证/数据清理十进制字段的任务我正在创建文件作为数据框并传递十进制列以进行验证。

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

1 个答案:

答案 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           |
+-----------------+

我想这就是所需要的。