如何将函数应用于 Spark DataFrame 的列?
How to apply a function to a column of a Spark DataFrame?
假设我们有一个 Spark DataFrame
df.getClass
Class[_ <: org.apache.spark.sql.DataFrame] = class org.apache.spark.sql.DataFrame
具有以下架构
df.printSchema
root
|-- rawFV: string (nullable = true)
|-- tk: array (nullable = true)
| |-- element: string (containsNull = true)
鉴于 tk
列的每一行都是一个字符串数组,如何编写一个 Scala 函数来 return 每行中的元素数?
一种方法是使用如下所示的 sql 访问它们。
df.registerTempTable("tab1")
val df2 = sqlContext.sql("select tk[0], tk[1] from tab1")
df2.show()
要获取数组列的大小,
val df3 = sqlContext.sql("select size(tk) from tab1")
df3.show()
如果您的 Spark 版本较旧,您可以使用 HiveContext 而不是 Spark 的 SQL Context。
我也会尝试一些遍历的东西。
您不必编写自定义函数,因为有一个:
import org.apache.spark.sql.functions.size
df.select(size($"tk"))
如果你真的想要你可以写一个udf
:
import org.apache.spark.sql.functions.udf
val size_ = udf((xs: Seq[String]) => xs.size)
甚至创建自定义表达式,但实际上没有任何意义。
假设我们有一个 Spark DataFrame
df.getClass
Class[_ <: org.apache.spark.sql.DataFrame] = class org.apache.spark.sql.DataFrame
具有以下架构
df.printSchema
root
|-- rawFV: string (nullable = true)
|-- tk: array (nullable = true)
| |-- element: string (containsNull = true)
鉴于 tk
列的每一行都是一个字符串数组,如何编写一个 Scala 函数来 return 每行中的元素数?
一种方法是使用如下所示的 sql 访问它们。
df.registerTempTable("tab1")
val df2 = sqlContext.sql("select tk[0], tk[1] from tab1")
df2.show()
要获取数组列的大小,
val df3 = sqlContext.sql("select size(tk) from tab1")
df3.show()
如果您的 Spark 版本较旧,您可以使用 HiveContext 而不是 Spark 的 SQL Context。
我也会尝试一些遍历的东西。
您不必编写自定义函数,因为有一个:
import org.apache.spark.sql.functions.size
df.select(size($"tk"))
如果你真的想要你可以写一个udf
:
import org.apache.spark.sql.functions.udf
val size_ = udf((xs: Seq[String]) => xs.size)
甚至创建自定义表达式,但实际上没有任何意义。