Apache spark 分组和求和后的RDD排序

Apache spark 分组和求和后的RDD排序,apache-spark,pyspark,pyspark-sql,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 =

我正试图对一些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

编辑:添加了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)
也许我们可以适应pyspark:

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())
现在谈谈你的问题:

不执行是怎么回事?那16号是怎么回事

简言之,您试图使用
summedDF.SUM(review_count#16)
引用该列的尝试无效


sort
函数使用
Column
对象(可通过调用
col(“name”)
创建),或直接使用列的名称。但是,在进行聚合时,没有为表示总和的新列选择名称,因此以后引用它有点困难。为了解决这个问题,我在第四行中使用了
.as(“sum\u列”)

抱歉,这是pyspark,不仅仅是spark。因此,这里的
>>
和其他命令中的“val”无法识别。对不起,我没有注意到这个细节。然而,逻辑应该是相同的。我相信python也可以使用相同的函数。@如果我试图为pyspark插入一个修改过的版本,请告诉我它是否有效。抱歉,我不太习惯pyspark。我正在从命令行启动sessoin,如下
pyspark--packages com.databricks:spark-csv_2.11:1.4.0
。那是派斯帕克,对吗?我不会让你的代码执行。它再次执行
,就像它没有完成一样。我正在尝试
finalDF=yelp\u df.where(“review\u count>9,open=true”).groupBy(“state”).agg(F.sum(col(“review\u count”).alias(“sum\u column”)).sort(col(“sum\u column”).desc)
是否在调用之间插入新行?如果是,必须以\