Scala 使用ApacheSpark进行文本输入排序

Scala 使用ApacheSpark进行文本输入排序,scala,sorting,apache-spark,Scala,Sorting,Apache Spark,我想使用spark shell(scala)对数据进行排序 输入类似(编辑-第一列可以包含两个空格) 我正在尝试使用 sc.textFile(“input.txt”) 现在我只想使用第一列对数据进行排序。 我知道我需要使用sortByKey(),但是为了使用sortByKey(),我应该首先应用哪个转换或操作?我得到的错误是sortByKey不是rdd.rdd数组[String]的成员,使用下面的代码似乎不正确 val lines = sc.textFile("input.txt") val s

我想使用spark shell(scala)对数据进行排序

输入类似(编辑-第一列可以包含两个空格)

我正在尝试使用 sc.textFile(“input.txt”)

现在我只想使用第一列对数据进行排序。 我知道我需要使用sortByKey(),但是为了使用sortByKey(),我应该首先应用哪个转换或操作?我得到的错误是sortByKey不是rdd.rdd数组[String]的成员,使用下面的代码似乎不正确

val lines = sc.textFile("input.txt")
val sort =  lines.map(_.Split("  ")).sortByKey()
预期产量

  DM  33QWSD  CC12    
AQWD  11BC23  A12A
BCDM  EEZM33  FFZ2
由于空格的ascii值为32,因此它将位于顶部,然后是剩余的排序数据。

sortByKey()
就是所谓的。它们仅适用于包含元组(键、值)的
RDD
。您的
RDD
将包含
Array[String]
。如果你想按自己的方式做,你可以这样做:

val lines = sc.textFile("input.txt")
val sort =  lines.map(_.split("  ")).map(arr => (arr(0),arr.mkString("  "))).sortByKey()
scala> lines.sortBy[String]( (line:String) => line.split("  ")(0), true, 1 ).foreach(println)
AQWD  11BC23  A12A
BCDM  EEZM33  FFZ2
ZXDM  33QWSD  CC12
编辑:是的,你可以一步完成这两张地图,我觉得这更可读:-)

您也可以这样做:

val lines = sc.textFile("input.txt")
val sort =  lines.map(_.split("  ")).map(arr => (arr(0),arr.mkString("  "))).sortByKey()
scala> lines.sortBy[String]( (line:String) => line.split("  ")(0), true, 1 ).foreach(println)
AQWD  11BC23  A12A
BCDM  EEZM33  FFZ2
ZXDM  33QWSD  CC12
@编辑:如果密钥不同,只需将其包含在逻辑中即可。例如,如果所有分隔符都是双空格,则可以将上述代码更改为:

lines.map(_.split("  ")).map(arr => (arr(0) + "  " + arr(1),arr.mkString("  ")))
或者第二个:

lines.sortBy[String]( (line:String) => { val split = line.split("  "); split(0) + "  " + split(1) }, true, 1 )

我们可以不使用sortByKey()吗?我想我们只能使用sortBykey()进行排序。我的主要目的是使用first对数据进行排序column@ViyatGandhi是的,请查看我的编辑,您需要使用不同的方法谢谢。。。这就是scala的基本用法。有什么方法可以利用spark函数进行排序吗?(地图或缩小图中的任何一个,以及末尾的一些排序)。因为将来我需要使用它对大文件进行排序。@ViyatGandhi不是这不是Scala的排序,它是来自
RDD
的Spark
sortBy
,并且正按照您的要求进行排序。你可以在文档中看到@ViyatGandhi Mateusz是对的!如果尚未定义键,您希望如何按键排序?