繁体   English   中英

在没有 sql 功能的情况下对 PySpark 中的 dataframe 进行排序

[英]Sorting a dataframe in PySpark without sql functions

我在打印这个查询时遇到了一些麻烦,其中月份按正确顺序排序。

是否有 pyspark function 命令以降序格式化月份列? (不使用 sql 命令)

from pyspark import SparkContext
from pyspark.sql import SQLContext
from operator import add

sc = SparkContext.getOrCreate()
sqlContext = SQLContext(sc)

rows = sc.textFile("data.csv")
data = rows.map(lambda line: line.split(","))
header = data.first()

q = data.filter(lambda line: line != header)\
        .map(lambda x:(x[1], 1))\
        .reduceByKey(add)\
        .sortByKey(True)\
        .collect()

sqlContext.createDataFrame(q, ['Month','Total number of operated flights']).show()

+-----+--------------------------------+
|Month|Total number of operated flights|
+-----+--------------------------------+
|    1|                          621559|
|   10|                          629992|
|   11|                          605149|
|   12|                          614139|
|    2|                          565604|
|    3|                          639209|
|    4|                          614648|
|    5|                          631609|
|    6|                          629280|
|    7|                          648560|
|    8|                          653279|
|    9|                          600187|
+-----+--------------------------------+

这是因为月份列被视为字符串。 有几种方法可以实现正确的顺序。 例如,您可以在 RDD 调用中将列强制转换为int并使用sortByKey(False)进行降序:

q = data.filter(lambda line: line != header)\
    .map(lambda x:(int(x[1]), 1))\
    .reduceByKey(add)\
    .sortByKey(False)\
    .collect()

我并不完全符合您的期望,但当然您不一定需要调用collect()从 RDD 生成 DF - 您可以通过运行来实现:

df = data.filter(lambda line: line != header)\
 .map(lambda x:(int(x[1]), 1))\
 .reduceByKey(add)\
 .sortByKey(False)
 .toDF()

您可以使用 DataFrame API 以及df.withColumn('Month', df['Month'].as(pyspark.sql.types.StringType())使用 Spark SQL。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM