我有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"..."
到"..." + "..."
的转换是在编译时完成的。
其他观察结果:
- 您不需要
var
或s"..."
即可开始/结束。这样做:val begindate = "2017-01-01"
- 请执行
Msg.print_info(dynamic_read_sql)
,让我们知道输出