Scala 使用ApacheSpark进行文本输入排序
我想使用spark shell(scala)对数据进行排序 输入类似(编辑-第一列可以包含两个空格) 我正在尝试使用 sc.textFile(“input.txt”) 现在我只想使用第一列对数据进行排序。 我知道我需要使用sortByKey(),但是为了使用sortByKey(),我应该首先应用哪个转换或操作?我得到的错误是sortByKey不是rdd.rdd数组[String]的成员,使用下面的代码似乎不正确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
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
的SparksortBy
,并且正按照您的要求进行排序。你可以在文档中看到@ViyatGandhi Mateusz是对的!如果尚未定义键,您希望如何按键排序?