Scala 使用数据帧在Spark中进行日期时间排序

Scala 使用数据帧在Spark中进行日期时间排序,scala,sorting,apache-spark,datetime,Scala,Sorting,Apache Spark,Datetime,我正在读取Spark(Scala语言)中的ASCII文本文件,其中包含以下格式的数据:- name|type|type_ver|id1|yyyy-mm-dd hh:mm:ss name|type|type_ver|id2|yyyy-mm-dd hh:mm:ss name|type|type_ver|id3|yyyy-mm-dd hh:mm:ss name|type|type_ver||yyyy-mm-dd hh:mm:ss 我需要从中提取类型、类型、id和时间戳列,然后根据时间戳按降序

我正在读取Spark(Scala语言)中的ASCII文本文件,其中包含以下格式的数据:-

name|type|type_ver|id1|yyyy-mm-dd hh:mm:ss
name|type|type_ver|id2|yyyy-mm-dd hh:mm:ss
name|type|type_ver|id3|yyyy-mm-dd hh:mm:ss
name|type|type_ver||yyyy-mm-dd hh:mm:ss    
我需要从中提取类型、类型、id和时间戳列,然后根据时间戳按降序对提取的条目进行排序(最新时间戳位于顶部)

这就是我正在使用的函数

def parseTable(line: String): (String, String, String, String) = {
    val fields = line.split("\\|")
    val type = fields(1)
    val type_ver = fields(2)
    val id = fields(3)
    val timeStamp = fields(4)
    (type, type_ver, id, timeStamp)
  }

  def main(args: Array[String]): Unit = {

    Logger.getLogger("org").setLevel(Level.ERROR)

    val conf = new SparkConf()
    val sc = new SparkContext(conf)
    val sqlContext = new SQLContext(sc)
    val spark = sqlContext.sparkSession

    import spark.implicits._

    var file = spark.read.textFile("/<path to file>/<filename>).repartition(10)
    val parseTables = file.map(parseTable).toDF
    val pattern = "yyyy-MM-dd HH:mm:ss"
    
    val newDF = parseTables.orderBy(unix_timestamp(parseTables(x => x._4), pattern).cast("timeStamp"))

    val newTable = parseTables.coalesce(1)
    newTable.saveAsTextFile("/<path to save file>/Test_1")
def parseTable(行:String):(String,String,String,String)={
val fields=line.split(“\\\\”)
val类型=字段(1)
val type\u ver=字段(2)
val id=字段(3)
val时间戳=字段(4)
(类型、类型版本、id、时间戳)
}
def main(参数:数组[字符串]):单位={
Logger.getLogger(“org”).setLevel(Level.ERROR)
val conf=new SparkConf()
val sc=新的SparkContext(配置)
val sqlContext=新的sqlContext(sc)
val spark=sqlContext.sparkSession
导入spark.implicits_
var file=spark.read.textFile(“/)。重新分区(10)
val parseTables=file.map(parseTable.toDF)
val pattern=“yyyy-MM-dd HH:MM:ss”
val newDF=parseTables.orderBy(unix_时间戳(parseTables(x=>x.。_4),pattern).cast(“时间戳”))
val newTable=parseTables.coalesce(1)
newTable.saveAsTextFile(“//Test_1”)
这个解决方案是在Stackoverflow本身上给出的,我试图在代码中实现它,但未能实现。此外,saveAsTextFile函数也因此停止工作


如何根据时间戳按降序对数据进行排序并将输出保存为文本文件?

您可以使用Spark CSV阅读器将文件读入数据帧,而无需手动解析。然后,您可以使用Spark CSV writer写出另一个CSV文件

val df = spark.read.option("delimiter", "|").csv("filename")
val df2 = df.orderBy(desc("_c4"))
df2.coalesce(1).write.option("delimiter", "|").csv("newfilename")

对不起,我的错,我忘了提到我正在读取的文件是“ASCII文本”格式。我尝试使用|"对于拆分,但它不起作用。使用上述文件格式,这会起作用吗?在试用之前,我需要询问一下,因为我正在处理的数据集非常大,所以除非我确定,否则我无法将其用于测试和绑定群集。@PixieDev csv是一种文本格式,因此应该可以起作用。如果需要,可以在文件的前10行进行测试。这将节省你一些时间。酷。我正在测试这个,并会在这里的评论中告诉你。是的,它工作正常。谢谢!