pyspark数据框同时由多列排序

时间:2019-03-11 22:16:13

标签: dataframe pyspark sql-order-by

我有一个包含一些数据的json文件,我将此json转换为pyspark dataframe(我选择了一些列,但并非全部),这是我的代码:

import os
from pyspark import SparkContext
from pyspark.streaming import StreamingContext
from pyspark.sql import SparkSession
import json
from pyspark.sql.functions import col

sc = SparkContext.getOrCreate()
spark = SparkSession(sc)
df=spark.read.json("/Users/deemaalomair/PycharmProj 
ects/first/deema.json").select('full_text', 
'retweet_count', 'favorite_count')
 c=df.count()
 print(c)
 df.orderBy(["retweet_count", "favorite_count"], ascending=[0, 0]).show(10)

这是输出:

                +--------------------+-------------+--------------+                             
                |           full_text|retweet_count|favorite_count|
                +--------------------+-------------+--------------+
                |Check out this in...|          388|           785|
                |Review – Apple Ai...|          337|           410|
                |This #iPhone atta...|          159|           243|
                |March is #Nationa...|          103|           133|
                | 

                      Amazing vide...|           87|           139|
                |Business email wi...|           86|           160|
                |#wallpapers #iPho...|           80|           385|
                |#wallpapers #iPho...|           71|           352|
                |#wallpapers #iPho...|           57|           297|
                |Millions of #iPho...|           46|            52|
                +--------------------+-------------+--------------+
                 only showing top 10 rows

第一季度: 现在我需要通过降序同时对两列进行排序('retweet_count','favorite_count')

我尝试了多种功能,如上面的功能和`

         Cols = ['retweet_count','favorite_count']
         df = df.OrderBy(cols,ascending=False).show(10)

但是所有这些都只排序第一列,而跳过第二列!我不是我做错了。 我知道有很多相同的问题,但是在将问题发布到这里之前,我已经尝试了一切!

Q2:全文的数据帧输出缩短了,我如何打印全文?

1 个答案:

答案 0 :(得分:0)

如果您试图同时在两列中看到降序值,则不会发生这种情况,因为每一列都有自己的单独顺序。

在上面的数据框中,您可以看到retweet_count和favorite_count都有其自己的顺序。您的数据就是这种情况。

>>> import os
>>> from pyspark import SparkContext
>>> from pyspark.streaming import StreamingContext
>>> from pyspark.sql import SparkSession
>>> sc = SparkContext.getOrCreate()
>>> spark = SparkSession(sc)
>>> df = spark.read.format('csv').option("header","true").load("/home/samba693/test.csv")
>>> df.show()
+---------+-------------+--------------+
|full_text|retweet_count|favorite_count|
+---------+-------------+--------------+
|      abc|           45|            45|
|      def|           50|            40|
|      ghi|           50|            39|
|      jkl|           50|            41|
+---------+-------------+--------------+

当我们基于两列应用排序时,实际上是在基于第一列进行排序,如果有平局,则它考虑的是第二列的值。但这可能不是您想要的。您将看到根据两列的总和对它们进行排序。

>>> df.orderBy(["retweet_count", "favorite_count"], ascending=False).show()
+---------+-------------+--------------+
|full_text|retweet_count|favorite_count|
+---------+-------------+--------------+
|      jkl|           50|            41|
|      def|           50|            40|
|      ghi|           50|            39|
|      abc|           45|            45|
+---------+-------------+--------------+

解决此问题的一种方法是添加一个新列,将这两个列的总和相加,并在新列上应用orderby,然后在订购后删除新列。

>>> from pyspark.sql.functions import expr
>>> df1 = df.withColumn('total',expr("retweet_count+favorite_count"))
>>> df1.show()
+---------+-------------+--------------+-----+
|full_text|retweet_count|favorite_count|total|
+---------+-------------+--------------+-----+
|      abc|           45|            45| 90.0|
|      def|           50|            40| 90.0|
|      ghi|           50|            39| 89.0|
|      jkl|           50|            41| 91.0|
+---------+-------------+--------------+-----+

通过使用新列进行排序并在以后将其删除

>>> df2 = df1.orderBy("total", ascending=False)
>>> df2.show()
+---------+-------------+--------------+-----+
|full_text|retweet_count|favorite_count|total|
+---------+-------------+--------------+-----+
|      jkl|           50|            41| 91.0|
|      abc|           45|            45| 90.0|
|      def|           50|            40| 90.0|
|      ghi|           50|            39| 89.0|
+---------+-------------+--------------+-----+
>>> df = df2.select("full_text","retweet_count","favorite_count")
>>> df.show()
+---------+-------------+--------------+
|full_text|retweet_count|favorite_count|
+---------+-------------+--------------+
|      jkl|           50|            41|
|      abc|           45|            45|
|      def|           50|            40|
|      ghi|           50|            39|
+---------+-------------+--------------+

希望这会有所帮助!