【问题标题】:Get week from current_date and create a table with dynamic name in SQL从 current_date 获取星期并在 SQL 中创建具有动态名称的表
【发布时间】:2019-12-18 00:29:00
【问题描述】:

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

表名的格式如下所述

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

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

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

所以当我下次运行查询时,它应该会自动创建一个名为db_name.subscriptions_wk32 的表。我可以从weekofyear('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_name.subscriptions_wk32 选择 * 来自…………

PS 我使用 Hive/Hue 作为 RDBMS

【问题讨论】:

  • 我的理解是,您希望该特定作业将在每个星期一运行,并使当前日期超出当前日期。例如选择 weekofyear('2019-08-05') 的 32;然后您需要将 32 传递给您的 create table 语句。对吗?
  • 绝对正确。一个小的变化是我想要前一周而不是当前周的表名

标签: sql hadoop hive create-table hue


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    您可以使用下面的 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;
    

    【讨论】:

      【解决方案3】:

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

      相反,有一个表 db_name.subscriptions 并添加一个指定周的列 - 可能是一周的第一个星期一或最后一个星期日。

      然后,无需创建单独的表,只需为每周插入行。

      你会发现拥有一张桌子的好处:

      • 数据库不会被许多名称相似的表弄得一团糟。
      • 通过更改where 子句(可以参数化)而不是更改from 子句(不能参数化),报表上运行的SQL 语句可以在任何一周运行。
      • 编写查看随时间变化的查询很容易。
      • 通过查询表可以很容易地查看可用的周数。

      如果每周产生不平凡的行数,则在同一个表中创建周分区非常有用。

      【讨论】:

      • 一个分区列将允许加载和重新加载分区而不涉及其他周和并行
      猜你喜欢
      • 2019-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-24
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多