簡體   English   中英

使用 scala 在 spark-sql 中的其他列檢索最大日期組

[英]Retrieval of max date group by other column in spark-sql with scala

環境 - spark-3.0.1-bin-hadoop2.7、ScalaLibraryContainer 2.12.3、Scala、SparkSQL、eclipse-jee-oxygen-2-linux-gtk-x86_64

我有一個 csv 文件,它有 3 列,數據類型為:String、Long、Date。 我想按字符串的第一列分組並檢索最大日期值。

為此,我從文本文件創建了 Person 對象的 RDD,並將其轉換為 dataframe 'peopleDF'。 將 dataframe 注冊為臨時視圖。 我使用 spark 提供的 sql 方法運行以下 sql 語句。

val maxDateDF = spark.sql("SELECT name, max(birthDate) maxDate FROM people group by name")

但它沒有給出名稱的正確最大日期。

我的樣本數據如下

Michael, 29,01/03/1992
Justin, 19,01/05/2002
Ben Stokes, 29,01/07/1992
Justin, 18,01/08/2003
Ben Stokes, 29,01/07/1993
Ben Stokes, 29,30/06/1993

如何按其他字段名稱檢索最大日期值組?

package org.apache.spark.examples.sql

import org.apache.spark.sql.Row
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.types._
import java.sql.Date
import breeze.linalg.max

object SparkSQLExample1 {

case class Person(name: String, age: Long, birthDate: String)

def main(args: Array[String]): Unit = {
val spark = SparkSession.builder().appName("Spark SQL basic example")
.config("spark.master", "local").getOrCreate();
import spark.implicits._
runInferSchemaExample(spark);
spark.stop()
}

 private def runInferSchemaExample(spark: SparkSession): Unit = {
import spark.implicits._
val peopleDF = spark.sparkContext
  .textFile("examples/src/main/resources/people.txt")
  .map(_.split(","))
  .map(attributes => Person(attributes(0), attributes(1).trim.toInt,attributes(2)))
  .toDF()
  
peopleDF.groupBy("age").count().show();
peopleDF.groupBy("name").avg("age").show();
  
 peopleDF.createOrReplaceTempView("people")
 
 implicit val mapEncoder = org.apache.spark.sql.Encoders.kryo[Map[String, Any]]
 val maxDateDF = spark.sql("SELECT name, max(birthDate) maxDate FROM people group by name")
 maxDateDF.map(teenager => teenager.getValuesMap[Any](List("name", "maxDate"))).collect().foreach(println)

}
}

在字符串類型列上應用max不會為您提供最大日期。 您需要先將其轉換為日期類型列:

val maxDateDF = spark.sql("SELECT name, max(to_date(birthDate, 'dd/MM/yyyy')) maxDate FROM people group by name")

如果您希望保留原始日期格式,可以使用date_format將其轉換回字符串:

val maxDateDF = spark.sql("SELECT name, date_format(max(to_date(birthDate, 'dd/MM/yyyy')), 'dd/MM/yyyy') maxDate FROM people group by name")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM