...
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"))
1条答案
按热度按时间llmtgqce1#
不走下坡路
.filter
因为我看不到那里的焦点。对于。转换
df级Dataframe转换
v2.4中df数组的变换
v3中df数组的变换
以下内容:
Dataframe转换
来自官方文件https://kb.databricks.com/data/chained-transformations.html df上的变换会像意大利面一样结束。这里的意见可能不同。
他们说这很混乱:
与之相比:
用lambda函数对v2.4中需要select和expr组合的df数组进行变换
用lambda函数变换v3中df的新数组函数
导入org.apache.spark.sql.functions.\uimport org.apache.spark.sql_
试试看。
最后的注解和提出的极好的观点(从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