大数据技术——实战项目:广告数仓(第六部分)报表数据导出至clickhouse

news2024/11/15 5:53:29

目录

第11章 报表数据导出

11.1 Clickhouse安装

11.2 Clickhouse建表

11.2.1 创建database

11.2.2 创建table

11.3 Hive数据导出至Clickhouse


第11章 报表数据导出

        由于本项目最终要出的报表,要求具备交互功能,以及进行自助分析的能力,所以为保证数据分析的最大灵活度,我们需要提供明细数据。

        上述描述对计算引擎提出来了两点要求:

        第一点:延迟低,交互式的自助分析,一般都要求低延时。

        第二点:支持的数据量大:由于需要计算明细数据,所说数据量相对较大。

        综合考虑:我们选择使用clickhouse作为分析引擎。

11.1 Clickhouse安装

Clickhouse的安装和使用可参考以下博客。

大数据技术—— Clickhouse安装-CSDN博客

11.2 Clickhouse建表

11.2.1 创建database

需要先启动hiveserver2,并执行clickhouse-client -m连接server

hadoop102 :)

create database ad_report;

use ad_report;

11.2.2 创建table

drop table if exists dwd_ad_event_inc;
create table if not exists dwd_ad_event_inc
(
    event_time             Int64 comment '事件时间',
    event_type             String comment '事件类型',
    ad_id                  String comment '广告id',
    ad_name                String comment '广告名称',
    ad_product_id          String comment '广告产品id',
    ad_product_name        String comment '广告产品名称',
    ad_product_price       Decimal(16, 2) comment '广告产品价格',
    ad_material_id         String comment '广告素材id',
    ad_material_url        String comment '广告素材url',
    ad_group_id            String comment '广告组id',
    platform_id            String comment '推广平台id',
    platform_name_en       String comment '推广平台名称(英文)',
    platform_name_zh       String comment '推广平台名称(中文)',
    client_country         String comment '客户端所处国家',
    client_area            String comment '客户端所处地区',
    client_province        String comment '客户端所处省份',
    client_city            String comment '客户端所处城市',
    client_ip              String comment '客户端ip地址',
    client_device_id       String comment '客户端设备id',
    client_os_type         String comment '客户端操作系统类型',
    client_os_version      String comment '客户端操作系统版本',
    client_browser_type    String comment '客户端浏览器类型',
    client_browser_version String comment '客户端浏览器版本',
    client_user_agent      String comment '客户端UA',
    is_invalid_traffic     UInt8 comment '是否是异常流量'
) ENGINE = MergeTree()
      ORDER BY (event_time, ad_name, event_type, client_province, client_city, client_os_type,
                client_browser_type, is_invalid_traffic);

11.3 Hive数据导出至Clickhouse

本项目使用spark-sql查询数据,然后通过jdbc写入Clickhouse,具体操作如下:

1)创建Maven项目,pom.xml文件如下

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.atguigu</groupId>
    <artifactId>ad_hive_to_clickhouse</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>

        <!-- 引入mysql驱动,目的是访问hive的metastore元数据-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.31</version>
        </dependency>

        <!-- 引入spark-hive模块-->
        <dependency>
            <groupId>org.apache.spark</groupId>
            <artifactId>spark-hive_2.12</artifactId>
            <version>3.3.1</version>
            <scope>provided</scope>
        </dependency>

        <!--引入clickhouse-jdbc驱动,为解决依赖冲突,需排除jackson的两个依赖-->
        <dependency>
            <groupId>ru.yandex.clickhouse</groupId>
            <artifactId>clickhouse-jdbc</artifactId>
            <version>0.2.4</version>
            <exclusions>
                <exclusion>
                    <artifactId>jackson-databind</artifactId>
                    <groupId>com.fasterxml.jackson.core</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>jackson-core</artifactId>
                    <groupId>com.fasterxml.jackson.core</groupId>
                </exclusion>
            </exclusions>
        </dependency>

        <!-- 引入commons-cli,目的是方便处理程序的输入参数 -->
        <dependency>
            <groupId>commons-cli</groupId>
            <artifactId>commons-cli</artifactId>
            <version>1.2</version>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>3.0.0</version>
                <configuration>
                    <!--将依赖编译到jar包中-->
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
                <executions>
                    <!--配置执行器-->
                    <execution>
                        <id>make-assembly</id>
                        <!--绑定到package执行周期上-->
                        <phase>package</phase>
                        <goals>
                            <!--只运行一次-->
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>



</project>

2)创建com.atguigu.ad.spark.HiveToClickhouse类,并编辑如下内容

package com.atguigu.ad.spark;

import org.apache.commons.cli.*;
import org.apache.spark.SparkConf;
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.SaveMode;
import org.apache.spark.sql.SparkSession;

public class HiveToClickhouse {
    public static void main(String[] args) {
        // 使用common-cli处理传入参数
        // 1 定义能够传入哪些参数
        Options options = new Options();
        options.addOption(OptionBuilder.withLongOpt("hive_db").withDescription("hive数据库名称(required)").hasArg(true).isRequired(true).create());
        options.addOption(OptionBuilder.withLongOpt("hive_table").withDescription("hive表名称(required)").hasArg(true).isRequired(true).create());
        options.addOption(OptionBuilder.withLongOpt("hive_partition").withDescription("hive分区(required)").hasArg(true).isRequired(true).create());
        options.addOption(OptionBuilder.withLongOpt("ck_url").withDescription("clickhouse的jdbc url(required)").hasArg(true).isRequired(true).create());
        options.addOption(OptionBuilder.withLongOpt("ck_table").withDescription("clickhouse表名称(required)").hasArg(true).isRequired(true).create());
        options.addOption(OptionBuilder.withLongOpt("batch_size").withDescription("数据写入clickhouse时的批次大小(required)").hasArg(true).isRequired(true).create());


        // 2 解析参数
        GnuParser gnuParser = new GnuParser();
        CommandLine cmd = null;
        try {
            cmd = gnuParser.parse(options, args);
        } catch (ParseException e) {
            e.printStackTrace();
            return;
        }


        // 创建spark-sql环境
        SparkConf conf = new SparkConf().setAppName("HiveToClickhouse");
        SparkSession sparkSession = SparkSession.builder()
                .enableHiveSupport()
                .config(conf)
                .getOrCreate();
        // 读取hive中的数据
        //5.设置如下参数,支持使用正则表达式匹配查询字段
        sparkSession.sql("set spark.sql.parser.quotedRegexColumnNames=true");

        Dataset<Row> dataset = sparkSession.sql("" +
                "select `(dt)?+.+` from " + cmd.getOptionValue("hive_db") + "." + cmd.getOptionValue("hive_table") + " where dt='" + cmd.getOptionValue("hive_partition") + "'");



        // 写入到clickhouse中
        dataset.write().format("jdbc")
                .mode(SaveMode.Append)
                .option("url",cmd.getOptionValue("ck_url"))
                .option("driver","ru.yandex.clickhouse.ClickHouseDriver")
                .option("dbtable",cmd.getOptionValue("ck_table"))
                .option("batch_size",cmd.getOptionValue("batch_size"))
                .save();

        sparkSession.close();

    }

}

3)上传hive-site.xml文件到项目的resource目录下

4)打包,并上传xxx-jar-with-dependencies.jarhadoop102节点/opt/module/spark

5)执行如下命令测试

spark-submit   \
--class com.atguigu.ad.spark.HiveToClickhouse \
--master yarn   \
ad_hive_to_clickhouse-1.0-SNAPSHOT-jar-with-dependencies.jar   \
--hive_db ad   \
--hive_table dwd_ad_event_inc \
--hive_partition 2023-01-07   \
--ck_url  jdbc:clickhouse://hadoop102:8123/ad_report   \
--ck_table dwd_ad_event_inc   \
--batch_size 1000

6)  在clickhouse中运行select * from dwd_ad_event_inc;  ,可看到数据已经导入clickhouse

注意事项:

1)本地安装的Spark,需由原来数仓安装的纯净版,替换为:

https://archive.apache.org/dist/spark/spark-3.3.0/spark-3.3.0-bin-hadoop3.tgz

2)为保证之前数仓的hive on spark环境可继续使用,需要在$HIVE_HOME/conf/spark-defaults.conf中增加如下参数:

spark.yarn.populateHadoopClasspath true

增加原因如下:

Running Spark on YARN - Spark 3.5.2 Documentation

3)为保证任务可提交到yarn运行,需在$SPARK_HOME/conf/spark-env.sh文件中增加如下参数:

export HADOOP_CONF_DIR=/opt/module/hadoop-3.1.3/etc/hadoop/

我们此项目安装的不是纯净版,所以不需要执行此操作。

前面章节:

大数据项目——实战项目:广告数仓(第一部分)-CSDN博客

大数据项目——实战项目:广告数仓(第二部分)-CSDN博客

大数据技术——实战项目:广告数仓(第三部分)-CSDN博客

大数据技术——实战项目:广告数仓(第四部分)-CSDN博客

大数据技术——实战项目:广告数仓(第五部分)-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2042029.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

什么是云原生?(二)

1. 云原生的定义 云原生指构建和运行应用以充分利用通过云技术交付模式交付的分布式计算。云原生应用旨在充分利用云技术平台特有的可扩展性、弹性和灵活性优势。 根据云原生计算基金会 (CNCF) 的定义&#xff0c;云原生技术可帮助企业在公有云、私有云和混合云环境中构建和…

22款奔驰GLE350加装原厂香氛负离子系统,起到了提神醒脑功能的效果

奔驰原厂香氛系统激活原车自带系统&#xff0c;将香气加藏储物盒中&#xff0c;通过系统调节与出风口相结合&#xff0c;再将香味传达至整个车厢&#xff0c;达到净化车厢空气的效果&#xff0c;让整个车厢更加绿色健康&#xff0c;清新淡雅。对于负离子系统同样实现原装位安装…

DASCTF 2024暑期挑战赛 easyjob

DASCTF 2024暑期挑战赛 easyjob 下载附件没有什么特别的&#xff0c;不过很明显是xxl-job的应用&#xff0c;而且是1.9.2版本的 我们去搜索文章https://xz.aliyun.com/t/13899 猜测有两个可能 一个是打api&#xff0c;一个打executor未授权 首先打api的话可以参考https://…

案例分享—国外深色UI界面设计赏析

在国外&#xff0c;深色界面设计&#xff08;Dark Mode&#xff09;已成为提升用户体验的重要趋势。它不仅有效减少屏幕亮度&#xff0c;保护用户视力&#xff0c;还能在夜晚或低光环境下提供更加舒适的浏览体验。设计师们普遍认识到&#xff0c;深色主题不仅提升了应用的视觉层…

.NET+WPF 桌面快速启动工具 GeekDesk

目录 前言 项目介绍 安装使用 1、下载安装 2、启动界面 项目功能 1、快速搜索程序和文件 2、显示设置 3、自定义壁纸 4、毛玻璃效果 5、自定义菜单图标 6、定时提醒 总结 项目地址 最后 前言 大家在平时工作中&#xff0c;是不是经常为了找某个文件或者应用而在…

[Qt][Qt 事件][下]详细讲解

目录 1.定时器0.是什么&#xff1f;1.QTimerEvent2.QTimer3.获取系统⽇期及时间 2.事件分发器1.概述2.事件分发器工作原理3.使用 3.事件过滤器0.是什么&#xff1f;2.使用 1.定时器 0.是什么&#xff1f; 在进⾏窗⼝程序的处理过程中&#xff0c;经常要周期性的执⾏某些操作&…

C++STL初阶(11):stack和queue的使用

栈和队列的先导知识在这里&#xff1a;C语言基础数据结构——栈和队列_栈和队列 插入取出数据-CSDN博客 1.容器适配器 从栈和队列开始&#xff0c;不少教材就不叫他们容器了&#xff0c;而是叫容器适配器 栈不是一种完全不同的数据结构&#xff0c;而是基于顺序表或者链表而实现…

家里总有宠物浮毛怎么办?除了宠物空气净化器真没更轻松的招了!

从几年前口罩问题爆发开始&#xff0c;我就养成了自我防护的习惯&#xff0c;家里常备口罩、消毒水&#xff0c;每天也会定时开窗通风。但是&#xff0c;由于现在天气热了&#xff0c;大多时候都闷在家里开着空调。家里两只猫时不时打个架&#xff0c;满屋子那猫毛飞得啊&#…

算法日记day 39(动归之打家劫舍)

一、打家劫舍1 题目&#xff1a; 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系统会自动报警。…

Containerd 介绍

早之前的 Docker Engine 中就有了 containerd&#xff0c;只不过现在是将 containerd 从 Docker Engine 里分离出来&#xff0c;作为一个独立的开源项目&#xff0c;目标是提供一个更加开放、稳定的容器运行基础设施。分离出来的 containerd 将具有更多的功能&#xff0c;涵盖整…

centos7安装Oracle 11g数据库

目录 一、安装前准备1、安装前置工具&#xff08;安装过可以忽略&#xff09;2、更配yum源2.1、备份原有源&#xff1b;2.2、下载阿里云base源和epel源&#xff1b;2.3、清理yum缓存2.4、生成新的缓存2.5、更新系统中所有软件到最新版&#xff08;按需谨慎操作&#xff09; 3 修…

做代理海外仓赚钱?代理仓如何实现盈利?

随着跨境电商与物流的火热&#xff0c;海外仓作为跨境贸易的新基建&#xff0c;也成为了一门生意。具体来说海外仓商业模式是一种通过在跨境贸易中设置离岸仓库&#xff0c;为客户提供包括商品存储、包装、发货、退货和售后服务等一系列跨境电商服务的商业模式。 海外仓的成本主…

跟《经济学人》学英文:2024年08月10日这期 A history-lover’s guide to the market panic over AI

A history-lover’s guide to the market panic over AI Past technologies offer clues to what comes next 原文&#xff1a; Andrew Odlyzko, a professor of mathematics at the University of Minnesota, has a side hustle: he has become one of the world’s foremo…

19523 最长上升子序列长度

### 分析 1. **问题描述**&#xff1a; - 给定一个序列&#xff0c;要求找到最长上升子序列的长度。 - 子序列可以是不连续的&#xff0c;但必须保持顺序。 2. **解决方案**&#xff1a; - 使用动态规划&#xff08;Dynamic Programming, DP&#xff09;来解决这个问…

RCE---无字母数字webshell

<?php if(isset($_GET[code])){$code $_GET[code];if(strlen($code)>35){die("Long.");}if(preg_match("/[A-Za-z0-9_$]/",$code)){die("NO.");}eval($code); }else{highlight_file(__FILE__); } 分析代码&#xff1a;传参不大于35&…

让可视化大屏摆脱面子工程的12个方法

提到可视化大屏&#xff0c;很多老铁就认为这是面子工程&#xff0c;花里胡哨&#xff0c;没啥用处&#xff0c;这固然和认知有关系&#xff0c;那么有没有办法让可视化大屏摆脱这种认知吗&#xff0c;千汇数据工场介绍往日经验&#xff0c;与大家探讨下。 可视化大屏面子工程…

C语言典型例题37

《C程序设计教程&#xff08;第四版&#xff09;——谭浩强》 例题3.5 按照按照考试成绩的等级输出百分制分数段&#xff0c;A等为85分以上&#xff0c;B等为70~84分&#xff0c;C等为 60~69分&#xff0c;D等在60分以下&#xff0c;成绩的等级从键盘输入 代码&#xff1a; //…

2024最新上门按摩系统源码APP打包教程!

**xhadmin、免费、开源、可商用** 上门按摩这两年很火&#xff0c;某宝、某鱼上盗版系统盛行&#xff0c;大都是留有后门的系统&#xff0c;加密授权&#xff0c;根本二开不了。 近期很多人反馈我们的上门按摩系统APP打包困难&#xff0c;今天我手把手教大家如何打包上门按摩A…

【CanMVK230】CanMV K230 开箱

【CanMVK230】CanMV K230 开箱 CanMV 是什么CanMV K230开发板硬件资源能做什么 开箱&#xff01;配套资料其他学习资料 K230我买到啦~。话不多说&#xff0c;开始分享我的使用过程。欢迎大神指点。 CanMV 是什么 CanMV开源项目由嘉楠科技&#xff08;Canaan&#xff09;官方创建…

【关于CVE-2024-38077 Windows Server 2012和Windows Server 2018安装安全补丁指南】

文章目录 背景问题描述产生原因解决方案解决步骤1. 安装BypassESU工具2. 补丁安装方法一&#xff1a;使用 Windows 更新功能方法二&#xff1a;手动下载补丁并安装 补丁验证方法一&#xff1a;在“控制面板”-“程序”-”程序和功能”-“已安装更新”中检查是否存在 KBS040434 …