python读取hdfs上的parquet文件方式


Posted in Python onJune 06, 2020

在使用python做大数据和机器学习处理过程中,首先需要读取hdfs数据,对于常用格式数据一般比较容易读取,parquet略微特殊。从hdfs上使用python获取parquet格式数据的方法(当然也可以先把文件拉到本地再读取也可以):

1、安装anaconda环境。

2、安装hdfs3。

conda install hdfs3

3、安装fastparquet。

conda install fastparquet

4、安装python-snappy。

conda install python-snappy

5、读取文件

##namenode mode:
from hdfs3 import HDFileSystem
from fastparquet import ParquetFile
 
hdfs = HDFileSystem(host=IP, port=8020)
sc = hdfs.open
 
pf = ParquetFile(filename, open_with=sc)
df = pf.to_pandas()
 
##返回pandas的DataFrame类型
 
##HA mode:
from hdfs3 import HDFileSystem
from fastparquet import ParquetFile
 
host = "nameservice1"
conf = {
    "dfs.nameservices":"nameservice1",
    ......
}
hdfs = HDFileSystem(host = host, pars = conf)
......

python访问HDFS HA的三种方法

python访问hdfs常用的包有三个,如下:

1、hdfs3

其实从安装便捷性和使用上来说,并不推荐hdfs3,因为他的系统依赖和网络要求较高,但是某些情况下使用hdfs3会比较方便,官网资料点这里。如上面介绍,IP直接访问namenode:

from hdfs3 import HDFileSystem
hdfs = HDFileSystem(host=namenode, port=8020)
hdfs.ls('/tmp')

HA访问:

host = "nameservice1"
conf = {"dfs.nameservices": "nameservice1",
    "dfs.ha.namenodes.nameservice1": "namenode113,namenode188",
    "dfs.namenode.rpc-address.nameservice1.namenode113": "hostname_of_server1:8020",
    "dfs.namenode.rpc-address.nameservice1.namenode188": "hostname_of_server2:8020",
    "dfs.namenode.http-address.nameservice1.namenode188": "hostname_of_server1:50070",
    "dfs.namenode.http-address.nameservice1.namenode188": "hostname_of_server2:50070",
    "hadoop.security.authentication": "kerberos"
}
fs = HDFileSystem(host=host, pars=conf)
 
##或者下面这种配置
host = "ns1"
conf = {
    "dfs.nameservices":"ns1",
 "dfs.ha.namenodes.ns1":"namenode122,namenode115",
 "dfs.namenode.rpc-address.ns1.namenode122":"nnlab01:8020",
 "dfs.namenode.servicerpc-address.ns1.namenode122":"nnlab01:8022",
 "dfs.namenode.http-address.ns1.namenode122":"nnlab01:50070",
 "dfs.namenode.https-address.ns1.namenode122":"nnlab01:50470",
 "dfs.namenode.rpc-address.ns1.namenode115":"nnlab02:8020",
 "dfs.namenode.servicerpc-address.ns1.namenode115":"nnlab02:8022",
 "dfs.namenode.http-address.ns1.namenode115":"nnlab02:50070",
 "dfs.namenode.https-address.ns1.namenode115":"nnlab02:50470",
}
hdfs = HDFileSystem(host = host, pars = conf)

2、hdfs

这种方法在使用的时候配置比较简单,官网资料也比较丰富,但是需要注意的是该API可以模拟用户访问,权限较大。IP直接访问:

import hdfs
client = hdfs.client.InsecureClient(url="http://namenode:50070", user="hdfs")

HA访问:

import hdfs
client = hdfs.client.InsecureClient(url="http://namenode1:50070;http://namenode2:50070", user="hdfs")

3、pyhdfs

安装命令:pip install PyHDFS

官网地址,直接访问:

import pyhdfs
client = pyhdfs.HdfsClient(hosts="namenode:50070",user_name="hdfs")

HA访问

import pyhdfs
client = pyhdfs.HdfsClient(hosts=["namenode1:50070","namenode2:50070"],user_name="hdfs")

补充知识:python spark中parquet文件写到hdfs,同时避免太多的小文件(block小文件合并)

在pyspark中,使用数据框的文件写出函数write.parquet经常会生成太多的小文件,例如申请了100个block,而每个block中的结果

只有几百K,这在机器学习算法的结果输出中经常出现,这是一种很大的资源浪费,那么如何同时避免太多的小文件(block小文件合并)?

其实有一种简单方法,该方法需要你对输出结果的数据量有个大概估计,然后使用Dataframe中的coalesce函数来指定输出的block数量

即可,具体使用代码如下:

df.coalesce(2).write.parquet(path,mode)

这里df是指你要写出的数据框,coalesce(2)指定了写到2个block中,一个block默认128M,path是你的写出路径,mode是写出模式,常用的是

"overwrite"和"append"。

以上这篇python读取hdfs上的parquet文件方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现超简单端口转发的方法
Mar 13 Python
Python模块搜索概念介绍及模块安装方法介绍
Jun 03 Python
利用Python的turtle库绘制玫瑰教程
Nov 23 Python
Python利用matplotlib绘制约数个数统计图示例
Nov 26 Python
pytorch中图像的数据格式实例
Feb 11 Python
python统计文章中单词出现次数实例
Feb 27 Python
Django Xadmin多对多字段过滤实例
Apr 07 Python
pandas中的ExcelWriter和ExcelFile的实现方法
Apr 24 Python
opencv 形态学变换(开运算,闭运算,梯度运算)
Jul 07 Python
浅析Python 抽象工厂模式的优缺点
Jul 13 Python
python3爬虫中多线程的优势总结
Nov 24 Python
python用opencv 图像傅里叶变换
Jan 04 Python
Python连接HDFS实现文件上传下载及Pandas转换文本文件到CSV操作
Jun 06 #Python
完美解决python针对hdfs上传和下载的问题
Jun 05 #Python
python读取hdfs并返回dataframe教程
Jun 05 #Python
python pymysql链接数据库查询结果转为Dataframe实例
Jun 05 #Python
python mysql中in参数化说明
Jun 05 #Python
JAVA SWT事件四种写法实例解析
Jun 05 #Python
pandas 像SQL一样使用WHERE IN查询条件说明
Jun 05 #Python
You might like
PHP array_flip() 删除重复数组元素专用函数
2010/05/16 PHP
php格式输出文件var_export函数实例
2014/11/15 PHP
PHP下SSL加密解密、验证、签名方法(很简单)
2020/06/28 PHP
基于Jquery的动态添加控件并取值的实现代码
2010/09/24 Javascript
关于递归运算的顺序测试代码
2011/11/30 Javascript
js弹出层(jQuery插件形式附带reLoad功能)
2013/04/12 Javascript
Javascript中匿名函数的多种调用方式总结
2013/12/06 Javascript
js HTML5 Ajax实现文件上传进度条功能
2016/02/13 Javascript
Angular 根据 service 的状态更新 directive
2016/04/03 Javascript
纯js实现瀑布流布局及ajax动态新增数据
2016/04/07 Javascript
Ajax异步获取html数据中包含js方法无效的解决方法
2017/02/20 Javascript
Angularjs过滤器实现动态搜索与排序功能示例
2017/12/13 Javascript
Vue实现侧边菜单栏手风琴效果实例代码
2018/05/31 Javascript
iconfont的三种使用方式详解
2018/08/05 Javascript
Node.js API详解之 timer模块用法实例分析
2020/05/07 Javascript
javascript前端和后台进行数据交互方法示例
2020/08/07 Javascript
一个基于flask的web应用诞生 bootstrap框架美化(3)
2017/04/11 Python
Python实现的计数排序算法示例
2017/11/29 Python
Python3.6笔记之将程序运行结果输出到文件的方法
2018/04/22 Python
python Pandas 读取txt表格的实例
2018/04/29 Python
Python PyAutoGUI模块控制鼠标和键盘实现自动化任务详解
2018/09/04 Python
python 为什么说eval要慎用
2019/03/26 Python
Python二维码生成识别实例详解
2019/07/16 Python
让你的Python代码实现类型提示功能
2019/11/19 Python
Python 基于wxpy库实现微信添加好友功能(简洁)
2019/11/29 Python
django 模型中的计算字段实例
2020/05/19 Python
vscode+PyQt5安装详解步骤
2020/08/12 Python
浅谈html5与APP混合开发遇到的问题总结
2018/03/20 HTML / CSS
美国在线面料商店:Online Fabric Store
2018/07/26 全球购物
高中毕业自我鉴定范文
2013/10/02 职场文书
求职信的要素有哪些呢
2013/12/26 职场文书
纪念一二九运动演讲稿
2014/09/16 职场文书
消费者理赔投诉书
2015/07/02 职场文书
结婚喜宴迎宾词
2015/08/10 职场文书
MySQL Innodb关键特性之插入缓冲(insert buffer)
2021/04/08 MySQL
基于Redis6.2.6版本部署Redis Cluster集群的问题
2022/04/01 Redis