web-dev-qa-db-fra.com

Comment accéder aux valeurs dans la colonne de tableau?

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").

7
user3439308
 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

7
Will

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

3
Jacek Laskowski
1
pathikrit