让决策更智能
新一代智能数据分析平台

GreenPlum 实际示例

观远产品部发表于:2021年03月18日 20:03:40更新于:2021年03月18日 20:29:40

1. 定义调度的数据表

本次我们要导入的 "每天订单分析"数据是存储在 greenplum 数据库中, 并且该数据是每天早上5点钟来更新的. 那么, 我们可以首先在 Guandata_Workbench的 greenplum 子目录下, 先创建一个 命名为 "每天订单分析" 的子目录. 因为我们的 settings.json 文件中, 已经配置了如下的"定时器":

{     
    "schedule_cron": {         
        "daily_07": "0+0+5+++?"     
    } 
}

那么我们在 "Guandata_Workbench/greenplum/每天订单分析" 目录下, 建立一个 daily_order_analysis.daily_07.sql 的文件:

select order_date, customer_id, max(customer_name), sum(sales) from sales_orders where order_date = '${yesterday_date}' group by order_date, customer_id

对于文件名来说, "daily_order_analysis.daily_07.sql"的 "daily_order_analysis"部分不重要, 重要的是其后缀: ".daily_07.sql". 对于由 "daily_07": "0+0+5+++?" 来触发的定时器, 其实现是: 当触发执行时, 自动遍历所有的以 ".daily_07.sql"结尾的sql, 并执行. NOTE: 这一步中一定要注意"数据表"的名字不会和现有表冲突. Workbench上传数据时, 会根据"数据表"名字来判断其是否已经存在, 如果已经存在, 则只做更新操作, 不会再新建表

2. 配置主键 (去重)

因为定时任务执行是, 每天都会更新数据, 这样就会有以下情况出现:

  1. 对于同一个数据源, 有时候数值统计的sql有问题, 需要重新跑一下来覆盖之前的数据

  2. 数据在每天的上传时会有叠加的部分(比如: 每天都是统计前一周的每日数据) 默认不做处理时, 有可能会出现, 同样的一条数据上传了多次的情况, 造成数据统计出问题. 解决方法: 指定某些列为"主键", 这样, 如果上传了2次数据, 系统也会根据"主键"来把重复的数据"去重". 注意: 被定义为主键的列, 其值不能为NULL 或者空字符串. ( Apache Cassandra的限制) 具体做法: 在数据源的表(本例中是"daily_order_analysis")目录下, 增加该数据源专有的 settings.json, 其内容是:

    {  
        "table": {      
            "columns": [          
                {"name": "order_date", "isPrimaryKey": true},          
                {"name": "customer_id", "isPrimaryKey": true}      
            ]  
        } 
    }

    来表明, 本表中, "order_date"和"customer_id"来作为"去重" 本节配置好了以后, 即使同样的sql执行多次, 其结果也不会有重复.

3. 补之前的数据

有了上面2步, 我们就可以等明天触发器调度时, 来自动导入前一天的数据了. 但是我们经常还需要把之前的一段时间的历史数据导入到系统中. 那么, 做法也很简单, 在相同目录下(本例子中为: "Guandata_Workbench/greenplum/每天订单分析"), 新建一个 "fill_data.once.sql", 其内容是:

select order_date, customer_id, max(customer_name), sum(sales) from sales_orders where order_date >= '2017-01-01' and order_date <= '2017-03-12' group by order_date, customer_id

系统会马上把之前的数据补好 提示: 需要在输入完所有的sql后, 再保存为 .once.sql, 因为, 系统会时时刻刻监视着这些目录下的 以".once.sql"结尾的文件, 如果发现了, 则马上会执行该sql. 如果执行完, 会把这个文件的后缀由 ".once.sql" 改为: ".once.sql_FINISHED" 或者 ".once.sql_FAILED"

4. 上传时全量覆盖之前的数据 (请小心操作)

有的时候, 我们需要在本次上传数据前, 提前清空掉之前的数据, 而用本次上传的数据全量覆盖 (类似于sql中的 truncate table, 但是table本身的schema是不会变化的) 这时, 需要对于该表的settings.json中增加一个 overwriteExistingData 参数

{     
    "table": {         
        "columns": [             
            {"name": "order_date", "isPrimaryKey": true},             
            {"name": "customer_id", "isPrimaryKey": true}         
        ],     
        "overwriteExistingData": true   
    } 
}

    您需要登录后才可以回复