J'ai un Dataframe avec une colonne. Chaque ligne de cette colonne a un tableau de valeurs String:
Valeurs dans mon cadre de données Spark 2.2
["123", "abc", "2017", "ABC"]
["456", "def", "2001", "ABC"]
["789", "ghi", "2017", "DEF"]
org.Apache.spark.sql.DataFrame = [col: array]
root
|-- col: array (nullable = true)
| |-- element: string (containsNull = true)
Quel est le meilleur moyen d'accéder aux éléments du tableau? Par exemple, j'aimerais extraire des valeurs distinctes dans le quatrième élément pour l'année 2017 (réponse "ABC", "DEF").
df.where($"col".getItem(2) === lit("2017")).select($"col".getItem(3))
voir getItem
depuis https://spark.Apache.org/docs/latest/api/scala/index.html#org.Apache.spark.sql.Column
Quel est le meilleur moyen d'accéder aux éléments du tableau?
L'accès aux éléments d'une colonne de tableau s'effectue par l'opérateur getItem .
getItem (key: Any): Column Expression qui extrait un élément situé à la position ordinale d'un tableau ou d'une valeur par clé dans une
MapType
.
Vous pouvez également utiliser (ordinal)
pour accéder à un élément à la position ordinal
.
val ds = Seq(
Array("123", "abc", "2017", "ABC"),
Array("456", "def", "2001", "ABC"),
Array("789", "ghi", "2017", "DEF")).toDF("col")
scala> ds.printSchema
root
|-- col: array (nullable = true)
| |-- element: string (containsNull = true)
scala> ds.select($"col"(2)).show
+------+
|col[2]|
+------+
| 2017|
| 2001|
| 2017|
+------+
C’est juste une question de choix personnel et de goût qui vous convient le mieux, par exemple getItem
ou simplement (ordinal)
.
Et dans votre cas, where
/filter
suivi de select
avec distinct
donner la bonne réponse (comme @Will l’a fait).
Depuis Spark 2.4.0, il existe une nouvelle fonction element_at($array_column, $index)
.