Как разбить строку на несколько строк без использования фреймов данных? - PullRequest
0 голосов
/ 12 апреля 2019

Я создал фреймы данных для разбиения строки на несколько строк на основе разделителя.Я использовал функцию взрыва для того же.Хотелось бы узнать, могу ли я обойти использование dataframe здесь и использовать только SparkSQL для выполнения этой операции.

Пример: в teradata есть функция Strtok для выполнения этого действия.

1 Ответ

0 голосов
/ 15 апреля 2019

Быстрый ответ : в 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|
+------+

Надеюсь, это ответит на ваш вопрос.

...