sparksql中的高阶函数

jvidinwx  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(641)

有人能解释一下吗 transform() 以及 filter() 在sparksql2.4中有一些高级的实际用例示例吗?
在sql查询中,这是仅用于数组列还是也可以应用于任何列类型。如果有人能演示高级应用程序的sql查询,那就太好了。
提前谢谢。

llmtgqce

llmtgqce1#

不走下坡路 .filter 因为我看不到那里的焦点。
对于。转换
df级Dataframe转换
v2.4中df数组的变换
v3中df数组的变换
以下内容:
Dataframe转换
来自官方文件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"))

用lambda函数对v2.4中需要select和expr组合的df数组进行变换

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"))

用lambda函数变换v3中df的新数组函数
导入org.apache.spark.sql.functions.\uimport 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/):
transform的工作原理类似于scala中的map函数。我不知道他们为什么选择将这个函数命名为transform…我认为array#map应该是一个更好的名称,特别是因为dataset#transform函数通常用于链接Dataframe转换。
更新
如果要对高阶函数使用%sql或显示方法,请参阅以下内容:https://docs.databricks.com/delta/data-transformation/higher-order-lambda-functions.html

相关问题