我有一个包含一些数据的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:全文的数据帧输出缩短了,我如何打印全文?
答案 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|
+---------+-------------+--------------+
希望这会有所帮助!