Быстрый ответ : в SQL нет встроенной функции, которая помогала бы эффективно разбивать строку на несколько строк на основе (строковое значение и разделители) по сравнению с flatMap()
или * 1004. * in ( API набора данных ) можно достичь.
И это просто потому, что в Dataframe вы можете программно манипулировать Rows
на гораздо более высоком уровне и степени детализации, чем Spark SQL.
Примечание: Dataset.explode()
устарело, начиная с ( Spark 2.0 )
explode () Устаревший: (с версии 2.0.0) используйте flatMap () или select () с
functions.explode () вместо
Вот два примера обоих методов, рекомендованных в предыдущей цитате.
Примеры
// Loading testing data
val mockedData = sc.parallelize(Seq("hello, world", "foo, bar")).toDF
+------------+
| value|
+------------+
|hello, world|
| foo, bar|
+------------+
Вариант 1 - flatMap ()
Разбить строки на кратные, используя flatMap()
scala> mockedData.flatMap( r => r.getString(0).split(",")).show
+------+
| value|
+------+
| hello|
| world|
| foo|
| bar|
+------+
Вариант 2 - functions.explode ()
Замена столбца значений новым набором Rows
, сгенерированным explode()
, который не рекомендуется использовать flatMap()
scala> mockedData.withColumn("value", explode(split($"value", "[,]"))).show
+------+
| value|
+------+
| hello|
| world|
| foo|
| bar|
+------+
Переключение на API Spark SQL:
Если вы хотите использовать sqlContext и начать запрашивать данные через SQL, теперь вы можете создать временное представление из полученного набора данных:
scala> val resultedDf = mockedData.flatMap( r => r.getString(0).split(","))
resultedDf: org.apache.spark.sql.Dataset[String] = [value: string]
scala> resultedDf.createOrReplaceTempView("temp")
scala> spark.sql("select * from temp").show
+------+
| value|
+------+
| hello|
| world|
| foo|
| bar|
+------+
Надеюсь, это ответит на ваш вопрос.