首页 > 解决方案 > 从 current_date 获取星期并在 SQL 中创建具有动态名称的表

问题描述

我每周运行一个特定的查询,创建所需数据的每周表。

表名的格式如下所述

  1. db_name.subscriptions_wk29 -- 为第 29 周数据创建的表
  2. db_name.subscriptions_wk30 -- 为第 30 周数据创建的表
  3. db_name.subscriptions_wk31 -- 为第 31 周数据创建的表

由于这是一项重复性任务,我想安排此查询,以便它在特定一周的每个星期一自动运行以获取前一周的数据。

我面临的问题是,我不知道如何在每周运行查询时动态更改表名。

因此,当我下次运行查询时,它应该会自动创建一个名为 name 的表db_name.subscriptions_wk32。我可以从中获取值 32,weekofyear('2019-08-05')但不知道如何将其放入表名中

目前我写如下

CREATE TABLE db_name.subscriptions_wk30 AS -- a hardcoded name
  SELECT *
  FROM ..........

我想要的是

CREATE TABLE db_name.subscriptions_wkCAST(weekofyear('2019-08-05') AS varchar) -- a dynamic name
      SELECT *
      FROM ..........

这将导致

创建表 db_name.subscriptions_wk32 SELECT * FROM ..........

PS 我使用 Hive/Hue 作为 RDBMS

标签: sqlhadoophivecreate-tablehue

解决方案


无法在查询本身中计算表名,但可以将参数传递给脚本。您可以在 shell 中计算参数并从 shell 执行脚本:

#You can provide date:
varDate=2019-08-05

#And calculate weekyear
weeknumber=$(date --date=${varDate} +%V)
echo "${weeknumber}"
#returns 32

#Or calculate current date weekyear
weeknumber=`date +%V`

#Or calculate previous week date
weeknumber="$(date -d "7 days ago" +"%V")" 

#And call hive script like this:
hive -e "CREATE TABLE db_name.subscriptions_wk${weeknumber} -- parametrized name suffix
      SELECT *
      FROM ...
"

或者您可以-hivevar在配置单元命令行中使用参数来调用脚本文件(-f选项),假设weeknumber已经像以前一样计算:

hive -hivevar weeknumber="$weeknumber" -f script_file_name

推荐阅读