web-dev-qa-db-fra.com

obtenir de la valeur de dataframe

Dans Scala, je peux utiliser get(#) ou getAs[Type](#) pour extraire des valeurs d'une trame de données. Comment dois-je le faire dans pyspark?

J'ai un DataFrame à deux colonnes: item(string) et salesNum(integers). Je fais un groupby et un mean pour obtenir une moyenne de ces nombres comme ceci: 

saleDF.groupBy("salesNum").mean()).collect()

et il fonctionne. Maintenant, j'ai la moyenne dans un cadre de données avec une valeur.

Comment puis-je extraire cette valeur du cadre de données pour obtenir la moyenne sous forme de nombre à virgule flottante?

5
M.Rez

collect() renvoie vos résultats sous forme de liste python. Pour obtenir la valeur de la liste, il suffit de prendre le premier élément comme ceci: 

saleDF.groupBy("salesNum").mean()).collect()[0] 
11
David

Pour être précis, collect renvoie une liste dont les éléments sont de type class 'pyspark.sql.types.Row'.

Dans votre cas, pour extraire la valeur réelle, vous devez faire:

saleDF.groupBy("salesNum").mean()).collect()[0]["avg(yourColumnName)"]

yourColumnName est le nom de la colonne dont vous prenez la moyenne (pyspark lors de l'application de la moyenne, renommez ainsi la colonne obtenue de cette manière).

A titre d'exemple, j'ai exécuté le code suivant, examinez les types et les sorties de chaque étape.

>>> columns = ['id', 'dogs', 'cats', 'nation']
>>> vals = [
...      (2, 0, 1, 'italy'),
...      (1, 2, 0, 'italy'),
...      (3, 4, 0, 'france')
... ]
>>> df = sqlContext.createDataFrame(vals, columns)
>>> df.groupBy("nation").mean("dogs").collect()
[Row(nation=u'france', avg(dogs)=4.0), Row(nation=u'italy', avg(dogs)=1.0)]
>>> df.groupBy("nation").mean("dogs").collect()[0]
Row(nation=u'france', avg(dogs)=4.0))
>>> df.groupBy("nation").mean("dogs").collect()[0]["avg(dogs)"]
4.0
>>> type(df.groupBy("nation").mean("dogs").collect())
<type 'list'>
>>> type(df.groupBy("nation").mean("dogs").collect()[0])
<class 'pyspark.sql.types.Row'>
>>> type(df.groupBy("nation").mean("dogs").collect()[0]["avg(dogs)"])
<type 'float'>
>>> 
>>>     
0
Francesco Boi