web-dev-qa-db-fra.com

Comment appliquer une fonction à une colonne d'un Spark DataFrame?

Supposons que nous ayons un DataFrame Spark

df.getClass
Class[_ <: org.Apache.spark.sql.DataFrame] = class org.Apache.spark.sql.DataFrame

avec le schéma suivant

df.printSchema
root
|-- rawFV: string (nullable = true)
|-- tk: array (nullable = true)
|    |-- element: string (containsNull = true)

Étant donné que chaque ligne de la colonne tk est un tableau de chaînes, comment écrire une fonction Scala qui renverra le nombre d'éléments dans chaque ligne?

7
ranlot

Vous n'êtes pas obligé d'écrire une fonction personnalisée car il y en a une:

import org.Apache.spark.sql.functions.size

df.select(size($"tk"))

Si vous voulez vraiment, vous pouvez écrire une udf:

import org.Apache.spark.sql.functions.udf

val size_ = udf((xs: Seq[String]) => xs.size)

ou même créer une expression personnalisée, mais cela n’a aucun sens.

12
zero323

Une façon est d'y accéder en utilisant le sql comme ci-dessous. 

df.registerTempTable("tab1")
val df2 = sqlContext.sql("select tk[0], tk[1] from tab1")

df2.show()

Pour obtenir la taille de la colonne de tableau, 

val df3 = sqlContext.sql("select size(tk) from tab1")
df3.show()

Si votre version de Spark est plus ancienne, vous pouvez utiliser HiveContext au lieu du contexte SQL de Spark. 

Je voudrais aussi essayer quelque chose qui traverse.

1
Srini