从当前_日期获取一周,并在SQL中创建一个具有动态名称的表

从当前_日期获取一周,并在SQL中创建一个具有动态名称的表,sql,hadoop,hive,create-table,hue,Sql,Hadoop,Hive,Create Table,Hue,我每周运行一个特定的查询,创建所需数据的每周表 表格名称的格式如下所述 db_name.subscriptions_wk29-为第29周数据创建的表 db_name.subscriptions_wk30-为第30周数据创建的表 db_name.subscriptions_wk31-为第31周数据创建的表 由于这是一项重复性任务,我希望安排此查询,以便它将在特定周的每个星期一自动运行,以获取前一周的数据 我面临的问题是,我不知道如何在每周运行查询时动态更改我的表名 因此,当我下次运行查询时,它应该

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

表格名称的格式如下所述

db_name.subscriptions_wk29-为第29周数据创建的表 db_name.subscriptions_wk30-为第30周数据创建的表 db_name.subscriptions_wk31-为第31周数据创建的表 由于这是一项重复性任务,我希望安排此查询,以便它将在特定周的每个星期一自动运行,以获取前一周的数据

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

因此,当我下次运行查询时,它应该自动创建一个名为db\u name.subscriptions\u wk32的表。我可以从2019-08-05周得到值32,但不知道如何将其放入表名中

目前我写它如下

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\u name.subscriptions\u wk32 挑选* 从


PS我使用Hive/Hue作为RDBMS

不可能在查询本身中计算表名,但可以将参数传递给脚本。 您可以在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

您可以使用下shell创建动态周表,并可以使用oozie调度器或作为cron作业安排它在每周一运行

#!/bin/bash


echo "Executing the hive query - get current week and store it in shell variable"

#current_week=$(hive -e "select weekofyear(current_date);")
#echo $current_week

previous_week=$(hive -e "select weekofyear(date_sub(current_date, 7));")
echo $previous_week
hive --hiveconf dbname=test_dev_db --hiveconf weekname=$previous_week -f hdfs://xxx.host.com:8020/user/xxx/dev/hadoop/hivescripts/createweektable.hql

echo "Executing the hive query - ends"


hive (test_dev_db)> desc test_dev_db.subscriptions_wk31;
OK
user_id                 int
country                 string
last_modified_date      date
Time taken: 0.345 seconds, Fetched: 3 row(s)
更新- 这就是如何在hql脚本中引用shell变量的方法

CREATE TABLE ${hiveconf:dbname}.subscriptions_wk${hiveconf:weekname}
row format delimited
fields terminated by '|'
STORED AS ORC
AS select * from test_dev_db.test_data;

别这样!拥有多个具有相同结构的并行表是一个非常糟糕的主意

相反,使用一个表db_name.subscriptions并添加一列来指定一周,可能是一周的第一个星期一或最后一个星期天

然后,不要创建单独的表,只需插入每周的行即可

您将发现拥有一张桌子的好处:

数据库将不会被许多具有相似名称的表弄乱。 通过更改可以参数化的where子句,而不是更改不能参数化的from子句,在报表上运行的SQL语句可以在任何一周运行。 编写查看随时间变化的查询很容易。 通过查询该表可以很容易地看到哪些周是可用的。
如果每周生成的行数不多,那么在同一个表中创建weeks分区是非常有用的。

我的理解是,您希望特定作业将在每个星期一运行,并使当前周超出当前日期。例如,2019-08-05年的选定工作周为32个;然后需要将32传递给CREATETABLE语句。对吧?绝对正确。一个小的变化是,我希望在表名中显示前一周而不是当前一周,分区列将允许加载和重新加载分区,而不接触其他周并并行进行