Техника записи нескольких столбцов в одну функцию в Scala - PullRequest
1 голос
/ 11 июля 2019

Ниже приведены два метода, использующих Spark Scala, где я пытаюсь найти, если столбец содержит строку, а затем суммировать количество вхождений (1 или 0), есть ли лучший способ записать его в одну функцию, гдемы можем избежать написания метода, каждый раз, когда добавляется новое условие.Заранее спасибо.

 def sumFunctDays1cols(columnName: String, dayid: String, processday: String, fieldString: String, newColName: String): Column = {
sum(when(('visit_start_time > dayid).and('visit_start_time <= processday).and(lower(col(columnName)).contains(fieldString)), 1).otherwise(0)).alias(newColName) }


 def sumFunctDays2cols(columnName: String, dayid: String, processday: String, fieldString1: String, fieldString2: String, newColName: String): Column = {
sum(when(('visit_start_time > dayid).and('visit_start_time <= processday).and(lower(col(columnName)).contains(fieldString1) || lower(col(columnName)).contains(fieldString2)), 1).otherwise(0)).alias(newColName) }

Ниже я вызываю функцию.

sumFunctDays1cols("columnName", "2019-01-01", "2019-01-10", "mac", "cust_count")
sumFunctDays1cols("columnName", "2019-01-01", "2019-01-10", "mac", "lenovo","prod_count")

Ответы [ 2 ]

0 голосов
/ 11 июля 2019

Сделать параметр для вашей функции списком, вместо String1, String2 .., сделать параметр в виде списка строк.Я реализовал небольшой пример для вас:

import org.apache.spark.sql.functions.udf

  val df = Seq(
    (1, "mac"),
    (2, "lenovo"),
    (3, "hp"),
    (4, "dell")).toDF("id", "brand")

  // dictionary Set of words to check

  val dict = Set("mac","leno","noname")

  val checkerUdf = udf { (s: String) => dict.exists(s.contains(_) )}

  df.withColumn("brand_check", checkerUdf($"brand")).show()

Надеюсь, это решит вашу проблему.Но если вам нужна помощь, загрузите весь фрагмент кода, и я помогу вам с этим.

0 голосов
/ 11 июля 2019

Вы можете сделать что-то вроде ниже (еще не проверено)

def sumFunctDays2cols(columnName: String, dayid: String, processday: String, newColName: String, fields: Column*): Column = {
  sum(
    when(
      ('visit_start_time > dayid)
        .and('visit_start_time <= processday)
        .and(fields.map(lower(col(columnName)).contains(_)).reduce( _ || _)),
      1
    ).otherwise(0)).alias(newColName)
}

И вы можете использовать его как

sumFunctDays2cols(
  "columnName",
  "2019-01-01", 
  "2019-01-10",
  "prod_count",
  col("lenovo"),col("prod_count")
)

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...