Spark Dataframe разрывает предупреждение об устаревании в 2.4.4 - PullRequest
0 голосов
/ 05 февраля 2020

Я использую последнюю версию Spark (2.4.4), и она показывает предупреждение об устаревании explode. Пожалуйста, предложите эффективную замену для следующего простого варианта использования:

scala> val myDF = Seq((1.2, "a b c d"), (2.1, "b g cc"), (4.4, "a b g cc")).toDF("time", "sentence")
myDF: org.apache.spark.sql.DataFrame = [time: double, sentence: string]

scala> val wordsDF = myDF.explode("sentence","word")((line: String) => line.split(" ")).groupBy("word").count().filter($"count" > 1).show
<console>:25: warning: method explode in class Dataset is deprecated: use flatMap() or select() with functions.explode() instead
       val wordsDF = myDF.explode("sentence","word")((line: String) => line.split(" ")).groupBy("word").count().filter($"count" > 1).show
                          ^
+----+-----+
|word|count|
+----+-----+
|  cc|    2|
|   g|    2|
|   b|    3|
|   a|    2|
+----+-----+

wordsDF: Unit = ()

scala> 

Заранее спасибо.

1 Ответ

1 голос
/ 05 февраля 2020

Как следует из предупреждения об устаревании, вы можете использовать функцию org. apache .spark. sql .functions.explode () :

import org.apache.spark.sql.functions.{explode, split}
myDF.select(explode(split($"sentence", " ")) as "word").groupBy("word").count().filter($"count" > 1).show
/*
+----+-----+
|word|count|
+----+-----+
|  cc|    2|
|   g|    2|
|   b|    3|
|   a|    2|
+----+-----+
*/

или использовать набор данных и flatMap ():

case class InData(time: Double, sentence: String)
case class OutData(word: String)
myDF.as[InData].flatMap(d => d.sentence.split(' ').map(OutData)).groupBy("word").count().filter($"count" > 1).show

/*
+----+-----+
|word|count|
+----+-----+
|  cc|    2|
|   g|    2|
|   b|    3|
|   a|    2|
+----+-----+
*/
...