从数据框中获取值

28
在Scala中,我可以使用get(#)getAs [Type] (#)从数据框中获取值。在pyspark中应该如何实现? 我有一个包含两列的DataFrame:item(字符串)salesNum(整数)。 我进行了groupbymean操作以获取这些数字的平均值,如下所示: saleDF.groupBy("salesNum").mean()).collect() 它能够正常工作。 现在我获得了一个包含一个值的数据框来表示平均值。 怎样从数据框中获得该值以获取平均值的浮点数呢?
3个回答

36

collect() 将结果以 Python 列表的形式返回。要从列表中获取值,只需要像这样取第一个元素:

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

3
谢谢。对于 RDD,它是一个二维列表,所以我可以使用 [0][0] 吗? - M.Rez
在IPython中开发不能给我代码遍历,所以我无法通过进入源代码或类似于IDE提供的内容来学习更多。 - M.Rez

33

准确地说,collect返回的是一个列表,其元素的类型为class 'pyspark.sql.types.Row'

在您的情况下,如果要提取真实值,应该执行以下操作:

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

yourColumnName是您要求平均值的列的名称(使用mean函数时,pyspark默认以此方式重命名结果列)。

例如,我运行了以下代码。查看每个步骤的类型和输出。

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

我有一个后续问题,附上链接,先行致谢!https://stackoverflow.com/questions/61823544/pyspark-mapping-multiple-columns @Francesco Boi - jgtrz

8

在这里,我们也可以使用first()

saleDF.groupBy("salesNum").mean()).first()[0]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,