IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> pyspark从hive导出数据到clickhouse -> 正文阅读

[大数据]pyspark从hive导出数据到clickhouse

需求

从hive导出数据到clickhouse 大概有两百个字段,两千多万数据,30G左右

实现

采用pyspark导入,先上代码

#_*_ coding=UTF-8 _*_
import os
import sys
from pyspark.sql import SparkSession


def sparksession_read_hive():  # .master("local[*]")
    spark = SparkSession.builder.appName('bi_pharaoh_mkt_lead_detail_to_clickhouse')\
        .enableHiveSupport().getOrCreate()
    hive_df = spark.sql("""select  
    place_type 
                ,sub_place_type 
                
    from  dm.test where pt = 20220314
    """)

    print(hive_df.show())
    print('sparkcontext_read_hive读取完毕,开始准备写入')
    properties = {'driver': 'ru.yandex.clickhouse.ClickHouseDriver',
                  "socket_timeout": "300000",
                  "rewriteBatchedStatements": "true",
                  "batchsize": "1000000",
                  "numPartitions": "8",
                  'user': 'analysis_superset',
                  'password': 'JEjGnIj96VVh9a0h',
                  'isolationLevel': 'NONE'
                  }

    hive_df.write.jdbc(url='jdbc:clickhouse://{url}:8123/analysis',
                       table='test_table', mode='append', properties=properties)
    print('sparksession_read_hive写入完成')
    spark.stop()


def spark_te():
    spark = SparkSession.builder.appName('clickhouse').getOrCreate()
    properties = {"driver": "ru.yandex.clickhouse.ClickHouseDriver",
                  "socket_timeout": "300000",
                  "rewriteBatchedStatements": "true",
                  "batchsize": "1000000",
                  "numPartitions": "8",
                  'user': 'analysis_superset',
                  'password': 'JEjGnIj96VVh9a0h'}
    df = spark.read.jdbc(url='jdbc:clickhouse://cc-2ze6h5d90y45bsizb.clickhouse.ads.aliyuncs.com:8123/analysis',
                         table='bi_pharaoh_mkt_lead_detail_da', properties=properties)
    # spark.read.jdbc(properties=properties)
    # print(spark.sql('select * from default.test'))
    print(df.show(10))


if __name__ == '__main__':
    sparksession_read_hive()
    # spark_te()

再详细解释下,上面sparksession_read_hive() 这个方法是写入的方法,spark_te()这个方法是读取clickhouse的方法。spark简单语法如下:
SparkSession是新版本推荐的入口api,所有的spark操作都需要SparkSession来执行,首先,创建一个接口,(类似于python的实例化)
语法是这样的:SparkSession.builder 然后,有下面几个函数:

  • .master(): 设置运行模式,即:本地模式还是yarn模式
  • appName(): 顾名思义,设置名字
  • enableHiveSupport() :这是hive接口函数,如果想要查询hive的表就需要执行这个函数
  • getOrCreate(:这是最终的函数,创建或者获取。

然后如果是同一个数据库拿这个实例直接执行sql就可以了。如果是不同数据库那就需要像我这么写了,spark.write().jdbc()
spark目前好像是与hive和mysql接口集成,即如果读写hive和mysql是不需要jdbc的方式的,其他的都需要。jdbc有四个参数,url table。mode(‘append’,‘overwrite’,‘error’,等) ,properties (连接的配置 ,以字典形式传入,其中‘driver’项是驱动,是固定的,连value一起都是固定传入,其他参数可以酌情使用),
spark还有其他函数,这里就不一一介绍了。

再说说踩过的坑,一开始配置好环境,环境配置可以参考
在pycharm中安装spark环境
Hadoop安装教程 Mac版
这两个结合着看就行

坑点1:

报错在这里插入图片描述
py4j.protocol.Py4JJavaError: An error occurred while calling o75.jdbc.
java.lang.ClassNotFoundException:ru.yandex.clickhouse.ClickHouseDriver
没有clickhouse的驱动,去下载一个驱动,放进spark下的jars中解决。

坑点2:可以读取,不可写入

这里耽误了好久,因为觉得已经能够读取了,那就肯定不是驱动的事,一直在找语法上的错误,最后在网上查到缺少guava-28.0-jre.jar包
错误信息为:
java.lang.NoClassDefFoundError: com/google/common/escape/Escapers
去下载一个放进 spark中的jar下,解决,但是要注意,3.1spark自带一个guava-14.0.jar,但自带的这个jar版本不够,必须放进去更高的版本。测试几次好像最低要guava-16.jar才行。另外,网上有人遇到放进spark的jars路径下无法解决,可以试试其他路径,参考链接:
Caused by: java.lang.NoClassDefFoundError: com/google/common/escape/Escapers

坑点3:不能overwrite

这个坑目前未解决,只要我用overwrite模式,就会报错,错误信息很粗略,改用append模式就能够成功写入,现在采取的方案是在执行spark程序之前先用clickhouse_driver 进行清空表的操作,然后使用append的模式写入。另外说一下,好像好多etl工具的overwrite模式好像都不怎么靠谱,动不动就报错。

最后,成功写入

参考文档
将数据通过spark从hive导入到Clickhouse

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-03-17 22:14:33  更:2022-03-17 22:15:30 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 6:37:47-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码