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 相关文章推荐
21行Python代码实现拼写检查器
Jan 25 Python
python3.6的venv模块使用详解
Aug 01 Python
将Python字符串生成PDF的实例代码详解
May 17 Python
python卸载后再次安装遇到的问题解决
Jul 10 Python
Python学习笔记之文件的读写操作实例分析
Aug 07 Python
Tensorflow轻松实现XOR运算的方式
Feb 03 Python
python实现简单飞行棋
Feb 06 Python
python学生管理系统的实现
Apr 05 Python
python动态规划算法实例详解
Nov 22 Python
python爬虫--selenium模块
Mar 31 Python
python爬取新闻门户网站的示例
Apr 25 Python
Python Pandas数据分析之iloc和loc的用法详解
Nov 11 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
优化使用mysql存储session的php代码
2008/01/10 PHP
php异步多线程swoole用法实例
2014/11/14 PHP
js换图片效果可进行定时操作
2014/06/09 Javascript
基于Bootstrap使用jQuery实现输入框组input-group的添加与删除
2016/05/03 Javascript
WebApi+Bootstrap+KnockoutJs打造单页面程序
2016/05/16 Javascript
Jquery实现select multiple左右添加和删除功能的简单实例
2016/05/26 Javascript
80%应聘者都不及格的JS面试题
2017/03/21 Javascript
vue中mint-ui环境搭建详细介绍
2017/04/06 Javascript
几种响应式文字详解
2017/05/19 Javascript
Async Validator 异步验证使用说明
2017/07/03 Javascript
jQuery实现导航栏头部菜单项点击后变换颜色的方法
2017/07/19 jQuery
使用async、enterproxy控制并发数量的方法详解
2018/01/02 Javascript
Vue的事件响应式进度条组件实例详解
2018/02/04 Javascript
详解如何实现一个简单的 vuex
2018/02/10 Javascript
Vue底层实现原理总结
2018/02/17 Javascript
vue.js轮播图组件使用方法详解
2018/07/03 Javascript
微信小程序实现的点击按钮 弹出底部上拉菜单功能示例
2018/12/20 Javascript
Vue.js实现备忘录功能
2019/06/26 Javascript
python检测某个变量是否有定义的方法
2015/05/20 Python
Python urllib request模块发送请求实现过程解析
2020/12/10 Python
html5-websocket基于远程方法调用的数据交互实现
2012/12/04 HTML / CSS
西班牙英格列斯百货英国官网:El Corte Inglés英国
2017/10/30 全球购物
美国在线购买和出售礼品卡网站:EJ Gift Cards
2019/06/09 全球购物
英国现代家具和照明购物网站:Heal’s
2019/10/30 全球购物
博士研究生自我鉴定范文
2013/12/04 职场文书
中药专业毕业自荐书范文
2014/02/08 职场文书
父母对孩子的寄语
2014/04/09 职场文书
团日活动总结书格式
2014/05/08 职场文书
求职自我推荐信
2014/06/25 职场文书
党员个人剖析材料
2014/09/30 职场文书
收款委托书
2014/10/14 职场文书
领导欢迎词致辞
2015/01/23 职场文书
2015年小学辅导员工作总结
2015/05/27 职场文书
班级联欢会主持词
2015/07/03 职场文书
使用@Value值注入及配置文件组件扫描
2021/07/09 Java/Android
Python中Schedule模块使用详解 周期任务神器
2022/04/19 Python