将PySpark数据帧列的聚合值存储到变量中

时间:2016-05-02 16:45:29

标签: apache-spark pyspark

我在这里使用PySpark数据帧。 " TEST1"是我的PySpark数据帧,event_date是TimestampType。因此,当我尝试获取event_date的非常计数时,结果是一个整数变量,但是当我尝试获得同一列的最大值时,结果是一个数据帧。我想了解数据框架和变量中的操作结果。我还想知道如何将事件日期的最大值存储为变量

导致整数类型的代码:

loop_cnt=test1.select('event_date').distinct().count()
type(loop_cnt)

导致数据框类型的代码:

last_processed_dt=test1.select([max('event_date')])
type(last_processed_dt)

编辑添加可重复的示例:

schema = StructType([StructField("event_date", TimestampType(), True)])

df = sqlContext.createDataFrame([(datetime(2015, 8, 10, 2, 44, 15),),(datetime(2015, 8, 10, 3, 44, 15),)], schema)

返回数据帧的代码:

last_processed_dt=df.select([max('event_date')])
type(last_processed_dt)

返回变量的代码:

loop_cnt=df.select('event_date').distinct().count()
type(loop_cnt) 

7 个答案:

答案 0 :(得分:6)

您无法直接访问数据框中的值。 Dataframe返回一个Row Object。相反,Dataframe为您提供了将其转换为python字典的选项。通过以下示例,我将计算平均字数:

wordsDF = sqlContext.createDataFrame([('cat',), ('elephant',), ('rat',), ('rat',), ('cat', )], ['word'])
wordCountsDF = wordsDF.groupBy(wordsDF['word']).count()
wordCountsDF.show()

以下是单词计数结果:

+--------+-----+
|    word|count|
+--------+-----+
|     cat|    2|
|     rat|    2|
|elephant|    1|
+--------+-----+

现在我计算count列的平均值应用collect()操作。记住collect()返回一个列表。这里列表只包含一个元素。

averageCount = wordCountsDF.groupBy().avg('count').collect()

结果看起来像这样。

[Row(avg(count)=1.6666666666666667)]

您无法使用某个python变量直接访问平均值。您必须将其转换为字典才能访问它。

results={}
for i in averageCount:
  results.update(i.asDict())
print results

我们的最终结果如下:

{'avg(count)': 1.6666666666666667}

最后,您可以使用以下方式访问平均值:

print results['avg(count)']

1.66666666667

答案 1 :(得分:1)

使用collect()

import pyspark.sql.functions as sf


distinct_count = df.agg(sf.countDistinct('column_name')).collect()[0][0]

使用first()

import pyspark.sql.functions as sf


distinct_count = df.agg(sf.countDistinct('column_name')).first()[0]

答案 2 :(得分:0)

我非常确定df.select([max('event_date')])会返回一个DataFrame,因为可能有多个行在该列中具有最大值。在您的特定用例中,该列中没有两行可能具有相同的值,但很容易想象一个多行可以具有相同的最大event_date的情况。

df.select('event_date').distinct().count()返回一个整数,因为它告诉您该特定列中有多少个不同的值。它不会告诉你哪个值最大。

如果您希望代码获取最大event_date并将其存储为变量,请尝试以下max_date = df.select([max('event_date')]).distinct().collect()

答案 3 :(得分:0)

Safari

要获得最大日期,我们应该尝试像

这样的东西
last_processed_dt=df.select([max('event_date')])

基于sujit的例子。我们实际上可以打印值而无需迭代/循环   [Row(avg(count)= 1.6666666666666667)]通过提供averageCount [0] [0]。

注意:我们没有经历循环,因为它只会返回一个值。

答案 4 :(得分:0)

尝试

loop_cnt=test1.select('event_date').distinct().count()
var = loop_cnt.collect()[0]

希望这会有所帮助

答案 5 :(得分:0)

trainDF.fillna({'Age':trainDF.select('Age').agg(avg('Age')).collect()[0][0]})

答案 6 :(得分:-1)

您可以尝试访问 collect() 函数。 从 spark 3.0 开始,您可以执行以下操作:

loop_cnt=test1.select('event_date').distinct().count().collect()[0][0]
print(loop_cnt)