从当前_日期获取一周,并在SQL中创建一个具有动态名称的表
我每周运行一个特定的查询,创建所需数据的每周表 表格名称的格式如下所述 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,但不知道如何将其放入表名中 目前我写它如下从当前_日期获取一周,并在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周数据创建的表 由于这是一项重复性任务,我希望安排此查询,以便它将在特定周的每个星期一自动运行,以获取前一周的数据 我面临的问题是,我不知道如何在每周运行查询时动态更改我的表名 因此,当我下次运行查询时,它应该
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语句。对吧?绝对正确。一个小的变化是,我希望在表名中显示前一周而不是当前一周,分区列将允许加载和重新加载分区,而不接触其他周并并行进行