【问题标题】:Sort using apache spark for text input使用 apache spark 进行文本输入排序
【发布时间】:2016-03-17 05:46:31
【问题描述】:

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

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

AQWD  11BC23  A12A
ZXDM  33QWSD  CC12
  DM  EEZM33  FFZ2

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

现在我只想使用第一列对数据进行排序。 我知道我需要使用 sortByKey() 但我应该先应用哪个转换或操作才能使用 sortByKey() ?我收到错误 sortByKey is not member of rdd.RDD Array[String] 通过使用下面看起来不正确的代码

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

预期输出

  DM  33QWSD  CC12    
AQWD  11BC23  A12A
BCDM  EEZM33  FFZ2

由于空格的 ascii 值为 32,它将位于顶部,然后是剩余的排序数据。

【问题讨论】:

    标签: scala sorting apache-spark


    【解决方案1】:

    sortByKey() 是所谓的OrderedRDDFunctions。它们仅适用于包含元组 (key,value)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
    

    @Edit:如果您的密钥不同,您只需将其包含在您的逻辑中。例如,如果您的所有分隔符都是双空格,您可以将上面的代码更改为:

    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() 进行排序。我的主要目的是使用第一列对数据进行排序
    • @ViyatGandhi 是的,请参阅我的编辑,您需要使用不同的方法
    • 谢谢!! ...所以这本质上是使用 scala。有什么办法可以利用火花功能并进行排序? (任何 map 或 reduce 以及最后的一些排序)。因为将来我需要使用这个对大文件进行排序。
    • @ViyatGandhi 不是这不是来自 Scala 的那种,它是来自RDD 的 Spark sortBy,并且正在做你所要求的。您可以在文档中看到它goo.gl/GmVfYQ
    • @ViyatGandhi Mateusz 是对的!如果您没有定义键,您希望如何按键排序?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多