如何将函数应用于Spark DataFrame的列?

时间:2016-01-05 14:37:13

标签: scala apache-spark dataframe apache-spark-sql

假设我们有一个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函数来返回每行中元素的数量?

2 个答案:

答案 0 :(得分:12)

您不必编写自定义函数,因为它有一个:

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)

甚至创建自定义表达式,但确实没有意义。

答案 1 :(得分:1)

一种方法是使用下面的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。

我也会尝试一些遍历的事情。