postgresql中写python去读取HDFS数据,像表一样使用。

简介

首先postgresql是支持python的,在安装postgresql数据库的时候需要执行python支持。可以使用python进行写fundcation 自然也就可以自定义funcation去读取HDFS文件,以此替换掉hive的,省去中间频繁切换服务器的麻烦。

安装postgresql


useradd postgres   --创建用户(此时会默认指定的用户组,这个用户名称建议保持一致)
cd /home/postgres/ --进入新建用户指定目录
curl -O https://ftp.postgresql.org/pub/source/v15.3/postgresql-15.3.tar.gz    --下载安装包
tar -zxvf postgresql-15.3.tar.gz  --解压压缩包
yum install -y bison flex readline-devel libicu-devel zlib-devel zlib zlib-devel gcc  gcc-c++ openssl-devel  python3-devel python3    --下载安装数据库基本依赖包,postgresql从14开始需要python3以上版本的支持 
cd postgresql-15.3
./configure --prefix=/home/postgres/pg --with-openssl  --with-python #拟安装至/home/postgres/pg

编译完成之后,使用echo $? 返回值为0 表示编译无报错信息
image.png

初始化数据库
mkdir /home/postgres/pg  --创建装载所需文件夹
sudo chown -R postgres:postgres /home/postgres/pg --进行授权
make world && make install-world

同样在构建完成之后使用echo $? 查看是否有报错信息返回值为0 继续执行一下操作
image.png

vi ~/.bash_profile      
export PATH=/home/postgres/pg/bin:$PATH      --指定bin文件路径 确保准备
export PGDATA=/home/postgres/pg/data         --指定data文件路劲 在初始化时会将data装载这个路径
source ~/.bash_profile --加载环境变量内容
cd /home/postgres/pg/bin   --进入指令包
./initdb -D $PGDATA  -U  postgres -W    --初始化数据库指定超级用户名和密码
pg_ctl  start  --启动数据库
pg_ctl status --查看数据库运行状态

image.png
如果需要外部数据库连接器链接到PG请自行修改防火墙文件和监听参数,此处不再累述。

创建支持读取HDFS文件的fundcation

python有多个moudle可以支持读取hdfs文件内容
首先在postgresql创建python3的拓展

 CREATE EXTENSION plpython3u CASCADE;

image.png
在postgresql创建一个测试数据库表,然后将其推送到HDFS上去

CREATE TABLE pg_hdfs AS SELECT id ,md5(id::varchar) FROM  generate_series(1,1000000) AS id ;

再讲表数据copy出来,

postgres=# copy pg_hdfs to '/home/postgres/pg_hdfs.csv' DELIMITER ',' CSV HEADER;
COPY 1000000

将数据推送到HDFS文件系统

[hadoop@vm06 ~]$ hdfs dfs -put pg_hdfs.csv  /user/hive/warehouse/pg.db/
[hadoop@vm06 ~]$ hdfs dfs -ls   /user/hive/warehouse/pg.db/

image.png

通过load 加载数据此时的hive 是可以正常查看该文件内容

hive>  CREATE TABLE IF NOT EXISTS pg_hdfs(>   id int, >   md5 string)> row format delimited> fields terminated by ',';
OK
Time taken: 0.829 seconds
hive> load data inpath '/user/hive/warehouse/pg.db/pg_hdfs.csv' into table pg.pg_hdfs;
Loading data to table pg.pg_hdfs
OK
Time taken: 1.289 seconds

此时得hive 是可以读取到pg_hdfs.csv文件内容得。
image.png

安装对应读取hdfs的包,本文使用spark进去读取该文件内容
pip3 install --upgrade pip
pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple pyspark
创建可接受远程hdfs文件的的type
保持和表结构一致,CREATE TYPE public.hdfs AS
(id integer,md5 character varying(200)
);
创建可读取hdfs的function
CREATE OR REPLACE FUNCTION pg_hdfs(host varchar(2000))
RETURNS SETOF hdfs
AS $$
from pyspark.sql import SparkSessiondef read_hdfs_file():spark = SparkSession \.builder \.master("local[1]") \.appName("PySpark read HDFS file") \.getOrCreate()df = spark.read.load(f"{host}",format="csv", sep=",", inferSchema="true", header="true")# 获取 id 和 md5 列数据,并逐个返回id_md5_data = df.select("id", "md5").collect()for row in id_md5_data:yield (row["id"], row["md5"])spark.stop()# 调用函数并返回结果
if __name__ == '__main__':for result_id_md5 in read_hdfs_file():yield result_id_md5
$$ LANGUAGE plpython3u;

关于yield关键字:
yield :yield 用于生成迭代器,并可以逐个地生成值,而不是一次性生成所有值。追行抓取保证数据的一一对应。
RETURNS SETOF hdfs:是指向返回数据记录。

此时的funcation可以像表一直执行关联和函数过滤

select  *  from pg_hdfs('hdfs://10.0.0.107:8020//user/hive/warehouse/pg.db/pg_hdfs/pg_hdfs.csv') where id < 10

image.png

测试用于表关联


select a.id , b.id  from pg_hdfs('hdfs://10.0.0.107:8020//user/hive/warehouse/pg.db/pg_hdfs/pg_hdfs.csv')   as a 
left join public.pg_hdfs  b 
on a.id = b.id 

image.png

查看执行计划

image.png

此方法对于比较喜欢使用python进行编程的小伙伴比较友好,使用FDW也可以,对于对postgresql不是很熟悉的博主认为操作还是比较繁琐。
这个方法的缺点就是性能还是比较差。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

XMind 2021 v11.1.2软件安装教程(附软件下载地址)

软件简介&#xff1a; 软件【下载地址】获取方式见文末。注&#xff1a;推荐使用&#xff0c;更贴合此安装方法&#xff01; XMind 2021 v11.1.2被誉为顶尖思维导图工具&#xff0c;以其简洁、整洁的界面和直观的功能布局脱颖而出。尽管软件体积小巧&#xff0c;却极具强大功…

OpenCV 入门(六) —— Android 下的人脸识别

OpenCV 入门系列&#xff1a; OpenCV 入门&#xff08;一&#xff09;—— OpenCV 基础 OpenCV 入门&#xff08;二&#xff09;—— 车牌定位 OpenCV 入门&#xff08;三&#xff09;—— 车牌筛选 OpenCV 入门&#xff08;四&#xff09;—— 车牌号识别 OpenCV 入门&#xf…

使用in运算符检查状态活动

在具有并行状态分解的Stateflow图表中&#xff0c;子状态可以同时处于活动状态。如果检查状态活动&#xff0c;则可以在两个平行状态下同步子状态。 例如&#xff0c;此图表有两个平行的状态&#xff1a;Place和Tracker。Tracker中的转换会在适当的位置检查状态活动&#xff0c…

icap对flash的在线升级

文章目录 一、icap原语介绍&#xff08;针对 S6 系列的 ICap&#xff09;&#xff0c;之后可以拓展到A7、K7当中去二、程序1设计2.1信号结构框图2.2 icap_delay设计2.3 icap_ctrl设计&#xff08;可以当模板使用&#xff0c;之后修改关键参数即可&#xff09; 三、程序2设计四、…

Edge视频增强功能

edge://flags/#edge-video-super-resolution 搜索Video查找 Microsoft Video Super Resolution 设置为Enabled

Selenium 保存会话信息避免重复登录实战!

前言 • 在一些实际开发场景中&#xff0c;我们在使用 Selenium 做自动化测试时需要保留用户的会话信息&#xff0c;从而避免重复登录&#xff0c;今天这篇文章就带大家实战如何使用 Selenium 保存会话信息。 版本 • Python 3.x 整体思路 • 当我们打开页面时&#xff0c;…

Android system property运作流程源码分析

一.序 前文分析了build.prop这个系统属性文件的生成&#xff0c;每个属性都有一个名称和值&#xff0c;他们都是字符串格式。属性被大量使用在Android系统中&#xff0c;用来记录系统设置或进程之间的信息交换。属性是在整个系统中全局可见的。每个进程可以get/set属性&#x…

【教学类-54-01】20240510超级对对碰(圆点拼图)(9*5、0-255随机)

作品展示 背景需求&#xff1a; 奕娃幼儿园小中大班益智区超级对对碰 - 小红书#幼儿园益智区 #幼儿园益智区素材 #幼儿园区域材料 #幼儿园环创https://www.xiaohongshu.com/discovery/item/6279bb4d000000002103be71?app_platformandroid&ignoreEngagetrue&app_ve…

【Redis】Redis 事务

Redis 的事务的本质是一组命令的批处理。这组命令在执行过程中会被顺序地、一次性 全部执行完毕&#xff0c;只要没有出现语法错误&#xff0c;这组命令在执行期间不会被中断 1.事务特性 仅保证了数据的一致性 这组命令中的某些命令的执行失败不会影响其它命令的执行&#xff…

如何挑选家用洗地机?需要注意什么?这四款洗地机性价比超高

洗地机结合了扫、拖、吸的功能&#xff0c;一台机器&#xff0c;一个推拉的动作便可以清理干净地面上的干湿垃圾&#xff0c;大大的节省了我们做家务的清洁时间&#xff0c;提升了生活质量。但是面对市面上众多的洗地机型号&#xff0c;我们要怎么去挑选呢&#xff0c;需要主要…

Linux下安装mysql8.0(以tar.xz包安装--编译安装)

前言&#xff1a;原文在我的博客网站中&#xff0c;持续更新数通、系统方面的知识&#xff0c;欢迎来访&#xff01; Linux下安装mysql8.0&#xff08;以tar.xz包安装--编译安装&#xff09;https://myweb.myskillstree.cn/126.html 目录 一、下载对应自己glic版本的MySQL …

论文解读--High-resolution Automotive Radar Point Cloud Imaging and Processing

高分辨汽车雷达点云成像和处理 摘要 汽车雷达具有体积小、硬件成本低、全天候工作、高分辨率等公认的优点&#xff0c;是高级驾驶辅助系统(ADAS)必不可少的一类重要传感器。然而&#xff0c;低角度分辨率和低成像性能的限制很难满足下一阶段ADAS的需要。新兴的4D成像雷达采用多…