Spark Sql排序操作无法正常工作

时间:2019-06-16 04:52:09

标签: scala apache-spark-sql

我正在尝试使用 sort 函数对数据框进行排序,但它未正确排序,似乎正在按块排序。也许是对单个分区进行排序,而不是对排序进行梳理。但是where子句可以正常工作

我也使用了sort函数和普通的sql查询,它们似乎都不起作用

[1, 2, 3, 4]
[1, 2, 3, 4, 'last']

这是我得到的输出:

System.setProperty("hadoop.home.dir", "C:\\winutils");    
val tempDir = "file:///c:/temp/spark-warehouse"    
Logger.getLogger("org").setLevel(Level.ERROR)
// Create a SparkContext using every core of the local machine, named RatingsCounter

val sparkSession = SparkSession
  .builder()
  .appName("AppStore")
  .master("local[2]")
  .config("spark.sql.warehouse.dir", tempDir)
  .getOrCreate()

var appStoreDF = sparkSession.read.format("csv").option("header", "true").load("../AppleStore.csv") 
appStoreDF.show(10)
import org.apache.spark.sql.functions._

appStoreDF.select("size_bytes").sort(desc("size_bytes")).show(10)  // Gives unsorted results

1 个答案:

答案 0 :(得分:1)

尝试将类型更改为Integer,然后按预期的顺序进行操作:

appStoreDF
  .withColumn("size_bytes", col("size_bytes").cast(sql.types.IntegerType))
  .select("size_bytes")
  .sort(desc("size_bytes"))
  .show(10)

输出:

+----------+
|size_bytes|
+----------+
| 999398400|
|  99978240|
|  99890176|
|       ...|
+----------+

size_bytes列类型为字符串。您可以通过以下方式进行验证:

appStoreDF.select("size_bytes").printSchema // size_bytes: string

当您在desc模式下对字符串进行排序时,它们将按字典顺序进行排序:999978400之前的99978240。