фрейм данных pyspark, упорядоченный по нескольким столбцам одновременно - PullRequest
1 голос
/ 12 марта 2019

у меня есть файл json, содержащий некоторые данные, я преобразовал этот json в фрейм данных pyspark (я выбрал некоторые столбцы, но не все), это мой код:

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

1: теперь мне нужно упорядочить этот фрейм данных по убыванию для двух столбцов одновременно ('retweet_count', 'fav__count')

Я попробовал несколько функций, таких как приведенная выше, и `

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

но все они просто заказывают первые столбцы и пропускают второй! Я не то, что я делаю неправильно. я знаю, что есть много одинаковых вопросов, но я попробовал все, прежде чем опубликовать вопрос здесь!

В2: вывод данных для полного текста сокращен, как я могу напечатать весь текст?

1 Ответ

0 голосов
/ 12 марта 2019

Если вы пытаетесь увидеть нисходящие значения в двух столбцах одновременно, этого не произойдет, поскольку каждый столбец имеет свой отдельный порядок.

В приведенном выше фрейме данных вы можете видеть, что как retweet_count, так и favour_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|
+---------+-------------+--------------+

Одним из способов решения этой проблемы является добавление нового столбца с суммой этих обоих столбцов и применение порядка к новому столбцу и удаление нового столбца после упорядочения.

>>> 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|
+---------+-------------+--------------+

Надеюсь, это поможет!

...