2017-03-08 324 views
1

我用斯卡拉編寫的spark代碼。 Spark讀取存儲要執行的SQL的元表(已在spark中作爲臨時表)。我對着Scala字符串變量替換

問題是,我們有疑問,它使用的變量(在Scala代碼中定義)

我嘗試不同的方法,但我不能用價值來替代變量。

var begindate= s"2017-01-01"; 
var enddate = s"2017-01-05"; 

Msg.print_info(s"begin processing from ${beginDate} to ${endDate}"); 


//Reading SQL from MetaData table stored in spark as meta_table (temp table) 

val dynamic_read_sql = s""" 
     select SQL_TEXT 
     from meta_table"""; 

val dynamic_sql_query = sqlContext.sql(dynamic_read_sql); 
val check_query = dynamic_sql_query.first().getString(0); 

Msg.print_info(s"check_query = $check_query"); 

我geting sql顯示正確。

// date is also temp table in spark 
select * from date where load_date >= '${begindate}' and load_date <='${enddate}' 

下一步是執行該SQL

dynamic_sql_find = sqlContext.sql(check_query); 

但它未能替換 '$ {BEGINDATE}' 和它們在代碼已經定義 '$ {ENDDATE}'。因此,返回0條記錄。

我試圖將商店存儲在另一個變量中。

val replace_check_query = s"${check_query}" 

但是,它並沒有取代變量。

你能幫忙嗎?

回答

4

正如@radumanolescu正確地說,BEGINDATE和結束日期僅在編譯時取代。要在運行時替換這些子字符串,可以手動替換子字符串:

val dynamic_sql_query = sqlContext.sql(check_query).replace("${begindate}", begindate).replace("${enddate}", enddate) 
+0

它工作正常。謝謝 !!! – jigarshah

3

變量begindate/enddate的取代成字符串(例如s"From $begindate to $enddate")被設置在編譯時,即表達式被轉換成類似"From " + begindate + " to " + enddate。這種轉換不能在運行時使用僅在運行時已知的隨機字符串完成。 值begindate/enddate僅在運行時被替換,即在運行時計算表達式"From " + begindate + " to " + enddate,但是在編譯時從s"...""..." + "..."的轉換被完成。

其他意見:

  • 你不需要vars"..."的開始/結束。這樣做:val begindate = "2017-01-01"
  • 請執行Msg.print_info(dynamic_read_sql),讓我們知道輸出