繁体   English   中英

DataFrame Spark的优化查询

[英]Optimization query for DataFrame Spark

我尝试从 Hive 表创建 DataFrame 。 但我对 Spark API 的工作很糟糕。

我需要帮助来优化方法getLastSession中的查询,将两个任务合二为一,用于 spark:

val pathTable = new File("/src/test/spark-warehouse/test_db.db/test_table").getAbsolutePath
val path      = new Path(s"$pathTable${if(onlyPartition) s"/name_process=$processName" else ""}").toString
val df        = spark.read.parquet(path)


def getLastSession: Dataset[Row] = {
  val lastTime        = df.select(max(col("time_write"))).collect()(0)(0).toString
  val lastSession     = df.select(col("id_session")).where(col("time_write") === lastTime).collect()(0)(0).toString
  val dfByLastSession = df.filter(col("id_session") === lastSession)

  dfByLastSession.show()
  /*
  +----------+----------------+------------------+-------+
  |id_session|      time_write|               key|  value|
  +----------+----------------+------------------+-------+
  |alskdfksjd|1639950466414000|schema2.table2.csv|Failure|

  */
  dfByLastSession
}

PS。 我的源表(例如):

name_process id_session time_write 钥匙 价值
其他类 jsdfsdfsf 43434883477 schema0.table0.csv 成功
其他类 jksdfkjhka 23212123323 schema1.table1.csv 成功
其他类 alskdfksjd 23343212234 schema2.table2.csv 失败
外部类 sdfjkhsdfd 34455453434 schema3.table3.csv 成功

您可以将row_number与 Window 一起使用,如下所示:

import org.apache.spark.sql.expressions.Window

val dfByLastSession = df.withColumn(
  "rn", 
  row_number().over(Window.orderBy(desc("time_write")))
).filter("rn=1").drop("rn")
    
dfByLastSession.show()

但是,由于您没有按任何字段进行分区,因此可能会降低性能。

您可以在代码中更改的另一件事是使用 struct ordering 来获取与最近id_session关联的time_write与一个查询:

val lastSession = df.select(max(struct(col("time_write"), col("id_session")))("id_session")).first.getString(0)

val dfByLastSession = df.filter(col("id_session") === lastSession)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM