簡體   English   中英

在 Spark 中循環 scala 列表

[英]Looping the scala list in Spark

我有一個如下所示的Scala列表。

partList: ListBuffer(2021-10-01, 2021-10-02, 2021-10-03, 2021-10-04, 2021-10-05, 2021-10-06, 2021-10-07, 2021-10-08)

目前,我根據上述日期將所有數據從源獲取到數據框中。

fctExistingDF = ss.read.table(existingTable).filter(s"event_date in ('${partList.mkString("','")}')")

后來我做了一些轉換並將數據加載到增量表中。 示例代碼如下。

fctDF = ss.read.table(existingTable).filter(s"event_date in ('${partList.mkString("','")}')")
    if (fctExistingDF.count() > 0) {
fctDF.createOrReplaceTempView("vw_exist_fct")
val existingRecordsQuery = getExistingRecordsMergeQuery(azUpdateTS,key)
ss.sql(existingRecordsQuery)
.drop("az_insert_ts").drop("az_update_ts")
.withColumn("az_insert_ts", col("new_az_insert_ts"))
.withColumn("az_update_ts", col("new_az_update_ts"))
.drop("new_az_insert_ts").drop("new_az_update_ts")
.select(mrg_tbl_cols(0), mrg_tbl_cols.slice(1,mrg_tbl_cols.length): _*)
.coalesce(72*2)
.write.mode("Append").format("delta")
.insertInto(mergeTable)
mergedDataDF = ss.read.table(mergeTable).coalesce(72*2)

mergedDataDF.coalesce(72)
      .write.mode("Overwrite").format("delta")
      .insertInto(s"${tgtSchema}.${tgtTbl}")
      

代碼中的以下命令基於 partList 中存在的 event_date 上的過濾條件創建數據幀。

fctExistingDF = ss.read.table(existingTable).filter(s"event_date in ('${partList.mkString("','")}')")

由於它正在創建包含大量數據的數據框,我想循環零件列表中的每個日期並將數據讀入數據框中,而不是一次過濾零件列表中的所有日期。

我在下面試過。

var counter = 0

while (counter < partList.length) {
  
  fctExistingDF = ss.read.table(existingTable).filter(s"event_date in (I should pass 1st date from the list)
 counter = counter + 1
 

我是 scala 的新手,也許我們應該在這里使用 foreach ? 有人可以幫忙嗎。 謝謝你。

您可以使用foreachmap ,取決於您是否要返回值 ( map ) 或不 ( foreach ):

import org.apache.spark.sql.functions.col

partList = List("2021-10-01", "2021-10-02", "2021-10-03", "2021-10-04", "2021-10-05", "2021-10-06", "2021-10-07", "2021-10-08")

partList.foreach { case date =>
   fctExistingDF = ss.read.table(existingTable).filter(col("event_date") === date) 
}

如果要返回數據框列表,請使用:

val dfs = partList.map { case date =>
   fctExistingDF = ss.read.table(existingTable).filter(col("event_date") === date) 

暫無
暫無

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

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