Как я могу оптимизировать функцию искры для замены нулей нулями? - PullRequest
1 голос
/ 05 июня 2019

Ниже приведена моя Spark-функция, которая обрабатывает пустые значения в столбце DataFrame независимо от его типа данных.

  def nullsToZero(df:DataFrame,nullsToZeroColsList:Array[String]): DataFrame ={
    var y:DataFrame = df
    for(colDF <- y.columns){
      if(nullsToZeroColsList.contains(colDF)){
        y = y.withColumn(colDF,expr("case when "+colDF+" IS NULL THEN 0 ELSE "+colDF+" end"))
      }
    }
    return y
  }

    import spark.implicits._
    val personDF = Seq(
      ("miguel", Some(12),100,110,120), (null, Some(22),200,210,220), ("blu", None,300,310,320)
    ).toDF("name", "age","number1","number2","number3")
    println("Print Schema")
    personDF.printSchema()
    println("Show Original DF")
    personDF.show(false)
    val myColsList:Array[String] = Array("name","age","age")
    println("NULLS TO ZERO")
    println("Show NullsToZeroDF")
    val fixedDF = nullsToZero(personDF,myColsList)

В приведенном выше коде у меня есть типы данных Integer и String, оба были обработаны моимFunciton.Но я подозреваю, что приведенный ниже фрагмент кода в моей функции может повлиять на производительность, но я не уверен.() и переназначение DF снова и снова?Заранее спасибо.

1 Ответ

0 голосов
/ 05 июня 2019

Я бы предложил собрать valueMap для na.fill(valueMap), чтобы заполнить null столбцы конкретными значениями в соответствии с типами данных, как показано ниже:

import org.apache.spark.sql.functions._
import spark.implicits._

val df = Seq(
  (Some(1), Some("a"), Some("x"), None),
  (None,    Some("b"), Some("y"), Some(20.0)),
  (Some(3), None,      Some("z"), Some(30.0))
).toDF("c1", "c2", "c3", "c4")

val nullColList = List("c1", "c2", "c4")

val valueMap = df.dtypes.filter(x => nullColList.contains(x._1)).
  collect{ case (c, t) => t match {
    case "StringType" => (c, "n/a")
    case "IntegerType" => (c, 0)
    case "DoubleType" => (c, Double.MinValue)
  } }.toMap
// valueMap: scala.collection.immutable.Map[String,Any] = 
//   Map(c1 -> 0, c2 -> n/a, c4 -> -1.7976931348623157E308)

df.na.fill(valueMap).show
// +---+---+---+--------------------+
// | c1| c2| c3|                  c4|
// +---+---+---+--------------------+
// |  1|  a|  x|-1.79769313486231...|
// |  0|  b|  y|                20.0|
// |  3|n/a|  z|                30.0|
// +---+---+---+--------------------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...