Что такое элегантный способ написания выражения case в кадре данных Scala Spark? `` - PullRequest
0 голосов
/ 05 декабря 2018

Я использую Scala, спарк-фрейм.Я хочу знать, есть ли какой-нибудь элегантный способ написания оператора switch / ifelse в Scala.

Ниже приведены мои текущие df и коды:

У меня есть кадр данных, который выглядит следующим образом:

|prot|flags|    count|
+----+-----+---------+
|   6|   16|122071304|
|   6|   24| 59400602|
|  17|    0| 44091431|
|  50|    0| 11183970|
|   6|    2|  7112224|
|   0|    0|  5795484|
|   6|   17|  4369082|
|   6|   18|  2977813|
|   1|    0|  2091200|
|   6|   20|  1637365|
|   6|    4|  1001986|
|  47|    0|   981261|
|   6|  194|   380139|
|   6|   25|   354766|
|   6|   82|   153315|
|   6|  152|    45541|
|   6|  144|    34044|
|   6|   26|    29071|
|  41|    0|    10199|
|  51|    0|     8993|
+----+-----+---------+

Я хочу использовать операторы case для создания нового категориального столбцана основе нескольких условий, чтобы сформировать таблицу ниже.Коды, которые я использую в настоящее время:

df.select($"prot",$"flags,$"count").withColumn("prot_name",when(col("prot")==="6", lit("TCP"))
      .otherwise(
        when(col("prot")==="17", lit("UDP"))
          .otherwise(
            when(col("prot") === "1", lit("ICMP"))
              .otherwise(lit("OTH")
              )
          )
      )).show()

Вывод:

+----+-----+---------+---------+
|prot|flags|    count|prot_name|
+----+-----+---------+---------+
|   6|   16|122071304|      TCP|
|   6|   24| 59400602|      TCP|
|  17|    0| 44091431|      UDP|
|  50|    0| 11183970|      OTH|
|   6|    2|  7112224|      TCP|
|   0|    0|  5795484|      OTH|
|   6|   17|  4369082|      TCP|
|   6|   18|  2977813|      TCP|
|   1|    0|  2091200|     ICMP|
|   6|   20|  1637365|      TCP|
|   6|    4|  1001986|      TCP|
|  47|    0|   981261|      OTH|
|   6|  194|   380139|      TCP|
|   6|   25|   354766|      TCP|
|   6|   82|   153315|      TCP|
|   6|  152|    45541|      TCP|
|   6|  144|    34044|      TCP|
|   6|   26|    29071|      TCP|
|  41|    0|    10199|      OTH|
|  51|    0|     8993|      OTH|
+----+-----+---------+---------+

Хотелось бы узнать, есть ли более элегантный / эффективный способ кодирования таких фреймов данных с использованием Scala.

Пожалуйста, сообщите.Спасибо!

1 Ответ

0 голосов
/ 05 декабря 2018

Вам не нужно вкладывать последовательное «когда» с предложением иначе, просто вызывайте методы when и только с одним предложением иначе в конце.Проверьте это:

scala> val df = Seq((6,16,"122071304"),(6,24,"59400602"),(17,0,"44091431"),(50,0,"11183970"),(6,2,"7112224"),(0,0,"5795484"),(6,17,"4369082"),(6,18,"2977813"),(1,0,"2091200"),(6,20,"1637365"),(6,4,"1001986"),(47,0,"981261"),(6,194,"380139"),(6,25,"354766"),(6,82,"153315"),(6,152,"45541"),(6,144,"34044"),(6,26,"29071"),(41,0,"10199"),(51,0,"8993")).toDF("prot","flags","count")
df: org.apache.spark.sql.DataFrame = [prot: int, flags: int ... 1 more field]


scala> df.select($"prot",$"flags",$"count").withColumn("prot_name",when(col("prot")==="6", lit("TCP")).when(col("prot")==="17", lit("UDP")).when(col("prot") === "1", lit("ICMP")).otherwise(lit("OTH"))).show()
+----+-----+---------+---------+
|prot|flags|    count|prot_name|
+----+-----+---------+---------+
|   6|   16|122071304|      TCP|
|   6|   24| 59400602|      TCP|
|  17|    0| 44091431|      UDP|
|  50|    0| 11183970|      OTH|
|   6|    2|  7112224|      TCP|
|   0|    0|  5795484|      OTH|
|   6|   17|  4369082|      TCP|
|   6|   18|  2977813|      TCP|
|   1|    0|  2091200|     ICMP|
|   6|   20|  1637365|      TCP|
|   6|    4|  1001986|      TCP|
|  47|    0|   981261|      OTH|
|   6|  194|   380139|      TCP|
|   6|   25|   354766|      TCP|
|   6|   82|   153315|      TCP|
|   6|  152|    45541|      TCP|
|   6|  144|    34044|      TCP|
|   6|   26|    29071|      TCP|
|  41|    0|    10199|      OTH|
|  51|    0|     8993|      OTH|
+----+-----+---------+---------+

scala>
...