Scala字符串变量替换

时间:2017-03-08 18:45:08

标签: scala apache-spark apache-spark-sql spark-dataframe

我有用scala编写的spark代码。 Spark读取存储要执行的SQL的元表(已在spark中作为临时表)。

我面临的问题是我们有使用变量的查询(在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");

我正在正确显示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);

但它未能取代&#39; $ {begindate}&#39;和&#39; $ {enddate}&#39;它们已在代码中定义。因此,返回0记录。

我试图将商店存储在另一个变量中。

val replace_check_query = s"${check_query}"

但是,它没有取代变量。

你能帮忙吗?

2 个答案:

答案 0 :(得分:5)

正如@radumanolescu正确地说的那样,begindate和enddate仅在编译时被替换。要在运行时替换这些,可以手动替换子字符串:

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

答案 1 :(得分: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)并告知我们输出