Scala字符串变量替换



我有Scala中写的火花代码。Spark读取元表(已经在Spark作为温度表中),该表存储要执行的SQL。

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

但无法替换已经在代码中定义的'$ {begindate}'和'$ {enddate}'。因此,返回0记录。

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

val replace_check_query = s"${check_query}"

但是,它没有替换变量。

您可以帮忙吗?

正如@radumanolescu正确地说,启动和端date仅在编译时被替换。为了在运行时替换它们,您可以手动替换子字母:

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

变量 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),让我们知道输出

相关内容

  • 没有找到相关文章

最新更新