Функции высшего порядка в Spark SQL - PullRequest
0 голосов
/ 02 августа 2020

Может ли кто-нибудь объяснить transform() и filter() в Spark Sql 2.4 с некоторыми расширенными примерами реальных случаев использования?

В запросе sql , это только для использования со столбцами массива или его также можно применить к любому типу столбца в целом. Было бы замечательно, если бы кто-нибудь мог продемонстрировать запрос sql для расширенного приложения.

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

1 Ответ

0 голосов
/ 03 августа 2020

Не идти по дороге .filter, так как я не вижу там фокуса.

Для .transform

  • преобразование фрейма данных на уровне DF
  • преобразование в массиве DF в версии 2.4
  • преобразование в массиве DF в версии 3

следующее:

преобразование кадра данных

Из официальных документов https://kb.databricks.com/data/chained-transformations.html преобразование в DF может закончиться как спагетти. Здесь мнения могут отличаться.

Это, как они говорят, беспорядок:

...
def inc(i: Int) = i + 1

val tmp0 = func0(inc, 3)(testDf) 
val tmp1 = func1(1)(tmp0) 
val tmp2 = func2(2)(tmp1) 
val res = tmp2.withColumn("col3", expr("col2 + 3"))

по сравнению с:

val res = testDf.transform(func0(inc, 4))
                .transform(func1(1))
                .transform(func2(2))
                .withColumn("col3", expr("col2 + 3"))

преобразование с помощью лямбда-функции в массиве DF в версии 2.4, для которой требуется комбинация select и expr

import org.apache.spark.sql.functions._
val df = Seq(Seq(Array(1,999),Array(2,9999)),  
         Seq(Array(10,888),Array(20,8888))).toDF("c1")
val df2 = df.select(expr("transform(c1, x -> x[1])").as("last_vals"))

преобразование с лямбда-функцией новая функция массива в DF в версии 3 с использованием withColumn

import org. apache .spark. sql .functions._ import org. apache .spark. sql ._

val df = Seq(
             (Array("New York", "Seattle")),
             (Array("Barcelona", "Bangalore"))
             ).toDF("cities")
val df2 = df.withColumn("fun_cities", transform(col("cities"), 
                        (col: Column) => concat(col, lit(" is fun!"))))

Попробуйте их.

Заключительное примечание и отличная точка поднята (от https://mungingdata.com/spark-3/array-exists-forall-transform-aggregate-zip_with/):

преобразование работает аналогично функции карты в Scala. Я не уверен, почему они решили назвать эту функцию преобразованием ... Я думаю, что имя array_map было бы более подходящим, особенно потому, что функция Dataset # transform обычно используется для цепочки преобразований DataFrame.

Update

Если вы хотите использовать% sql или подход отображения для функций высшего порядка, обратитесь к этому: https://docs.databricks.com/delta/data-transformation/higher-order-lambda-functions.html

...