分组和求和后的RDD排序

时间:2016-05-04 17:35:12

标签: apache-spark pyspark pyspark-sql

我试图对某些yelp数据进行一些分析。数据的结构如下:

>>> yelp_df.printSchema()
root
 |-- business_id: string (nullable = true)
 |-- cool: integer (nullable = true)
 |-- date: string (nullable = true)
 |-- funny: integer (nullable = true)
 |-- id: string (nullable = true)
 |-- stars: integer (nullable = true)
 |-- text: string (nullable = true)
 |-- type: string (nullable = true)
 |-- useful: integer (nullable = true)
 |-- user_id: string (nullable = true)
 |-- name: string (nullable = true)
 |-- full_address: string (nullable = true)
 |-- latitude: double (nullable = true)
 |-- longitude: double (nullable = true)
 |-- neighborhoods: string (nullable = true)
 |-- open: boolean (nullable = true)
 |-- review_count: integer (nullable = true)
 |-- state: string (nullable = true)

我想计算每个州有10个或更多评论的记录,这些评论目前是开放的,并且找到计数第三的州。首先我做了

>>> revDF = yelp_df.filter(yelp_df.review_count > 9)
>>> openDF = revDF.filter(revDF.open == True)
>>> openDF.groupBy("state").agg({"review_count":"sum"}).collect()

给出了这个

[Row(state=u'MN', SUM(review_count#16)=3470), Row(state=u'GA', SUM(review_count#16)=5764), Row(state=u'TX', SUM(review_count#16)=1778), Row(state=u'AZ', SUM(review_count#16)=72214), Row(state=u'NY', SUM(review_count#16)=4081), Row(state=u'OR', SUM(review_count#16)=2125), Row(state=u'ID', SUM(review_count#16)=429), Row(state=u'CA', SUM(review_count#16)=1876), Row(state=u'CO', SUM(review_count#16)=6720), Row(state=u'WA', SUM(review_count#16)=525), Row(state=u'LA', SUM(review_count#16)=8394)]

现在将其存储到summedDF后,

summedDF.sort(summedDF.state.desc()).collect()

按国家排序就好了,但(不出所料)

summedDF.sort(summedDF.SUM(review_count#16).desc()).collect()

不起作用。 实际上,它甚至都没有运行。我有正确数量的括号,但不是执行,而是先使用...转到下一行,等待新输入。

我如何做到这一点,以及不执行的情况如何?什么是#16?

1 个答案:

答案 0 :(得分:3)

修改:为pyspark添加了版本。

我建议你将代码重构为:

SELECT  @TICKET_AGE = MAX(DATEDIFF(second,DATE_ENTERED,GETDATE()) / 60)
FROM    TICKETS
WHERE   LOWER(STATUS_DESCRIPTION) LIKE '%new%'

也许我们可以适应pyspark:

val finalDF = yelp_df
  .where(col("review_count") > 9 && col("open") === true)
  .groupBy("state")
  .agg(sum("review_count").as("sum_column"))
  .sort(col("sum_column").desc)

现在回答你的问题:

  

非执行情况如何?什么是#16?

简而言之,您尝试使用from pyspark.sql.functions import * finalDF = yelp_df \ .where((col("review_count") > 9) & (col("open") == True)) \ .groupBy("state") \ .agg(col("state"), sum(col("review_count")).alias("sum_column")) \ .sort(col("sum_column").desc()) 引用该列无效。

summedDF.SUM(review_count#16)函数使用sort个对象(可以通过调用Column创建),或直接使用列的名称。但是,当您进行聚合时,您没有为表示总和的新列选择一个名称,因此稍后引用它有点困难。为了解决这个问题,我在第四行使用了col("name")