Как добавить регистр переключения для оператора like в scala? - PullRequest
0 голосов
/ 05 октября 2018

У меня есть фрейм данных со столбцом (A, B), где столбец B - это бесплатный тест, который я преобразовываю в тип (NOT_FOUND, TOO_LOW_PURCHASE_COUNT и т. Д.) Для лучшей агрегации.Я создал коммутационный ящик всех возможных паттеров и их соответствующего типа, но он не работает.

def getType(x: String): String = x match {
    case "Item % not found %" =>"NOT_FOUND"
    case "%purchase count % is too low %" =>"TOO_LOW_PURCHASE_COUNT"
    case _ => "Unknown"
}

getType("Item 75gb not found") 

val newdf = df.withColumn("updatedType",getType(col("raw_type"))) 

Это дает мне «Неизвестный».Может кто-нибудь сказать мне, как сделать переключение дела для оператора как?

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Символ SQL "%" в мире регулярных выражений можно заменить на ". *".UDF может быть создан для соответствия значения шаблонам:

val originalSqlLikePatternMap = Map("Item % not found%" -> "NOT_FOUND",
  // 20 other patterns here
  "%purchase count % is too low %" -> "TOO_LOW_PURCHASE_COUNT")
val javaPatternMap = originalSqlLikePatternMap.map(v => v._1.replaceAll("%", ".*") -> v._2)

val df = Seq(
  "Item foo not found ", "Foo purchase count 1 is too low ", "#!@"
).toDF("raw_type")

val converter = (value: String) => javaPatternMap.find(v => value.matches(v._1)).map(_._2).getOrElse("Unknown")
val converterUDF = udf(converter)

val result = df.withColumn("updatedType", converterUDF($"raw_type"))
result.show(false)

Вывод:

+--------------------------------+----------------------+
|raw_type                        |updatedType           |
+--------------------------------+----------------------+
|Item foo not found              |NOT_FOUND             |
|Foo purchase count 1 is too low |TOO_LOW_PURCHASE_COUNT|
|#!@                             |Unknown               |
+--------------------------------+----------------------+
0 голосов
/ 05 октября 2018

Использование when и like

import org.apache.spark.sql.functions.when

val df = Seq(
  "Item foo not found",  "Foo purchase count 1 is too low ", "#!@"
).toDF("raw_type")

val newdf = df.withColumn(
  "updatedType",
  when($"raw_type" like "Item % not found%", "NOT_FOUND")
    .when($"raw_type" like "%purchase count % is too low%", "TOO_LOW_PURCHASE_COUNT")
    .otherwise("Unknown")
)

Результат:

newdf.show
// +--------------------+--------------------+
// |            raw_type|         updatedType|
// +--------------------+--------------------+
// |  Item foo not found|           NOT_FOUND|
// |Foo purchase coun...|TOO_LOW_PURCHASE_...|
// |                 #!@|             Unknown|
// +--------------------+--------------------+

Ссылка:

...