Scala字符串变量替换

4
我有用Scala编写的Spark代码。 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}"

但是,它没有替换变量。

你能帮忙吗?

2个回答

6
正如@radumanolescu正确所说,begindate和enddate只在编译时替换。如果要在运行时替换这些内容,您可以手动替换子字符串:
val dynamic_sql_query = sqlContext.sql(check_query).replace("${begindate}", begindate).replace("${enddate}", enddate)

5
将变量begindate / enddate替换为字符串(例如s“From $begindate to $enddate”)设置为编译时,即您的表达式被翻译成类似于“From”+ begindate +“to”+enddate的内容。这种转换无法在运行时使用随机字符串进行,该字符串仅在运行时才知道。 begindate / enddate的值仅在运行时进行替换,即计算表达式“From”+ begindate +“to”+enddate在运行时进行,但是从s“...”到“...”+“...”的转换是在编译时完成的。
其他观察:
- 您不需要var或s“...”来设置begin/end。请这样做:val begindate =“2017-01-01” - 请执行Msg.print_info(dynamic_read_sql)并告诉我们输出结果。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接