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?
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.
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.