![](/img/trans.png)
[英]Write a pyspark.sql.dataframe.DataFrame without losing information
[英]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.