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 相关文章推荐
以一段代码为实例快速入门Python2.7
Mar 31 Python
python获取当前计算机cpu数量的方法
Apr 18 Python
Python求算数平方根和约数的方法汇总
Mar 09 Python
Python数据可视化编程通过Matplotlib创建散点图代码示例
Dec 09 Python
在python win系统下 打开TXT文件的实例
Apr 29 Python
python获取微信小程序手机号并绑定遇到的坑
Nov 19 Python
详解Python3中ceil()函数用法
Feb 19 Python
pyqt5 使用cv2 显示图片,摄像头的实例
Jun 27 Python
解决Django Static内容不能加载显示的问题
Jul 28 Python
python sqlite的Row对象操作示例
Sep 11 Python
Restful_framework视图组件代码实例解析
Nov 17 Python
Selenium+BeautifulSoup+json获取Script标签内的json数据
Dec 07 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
How do I change MySQL timezone?
2008/03/26 PHP
PHP中如何判断AJAX提交的数据
2012/02/05 PHP
PHP中__get()和__set()的用法实例详解
2013/06/04 PHP
基于PHP技术开发客服工单系统
2016/01/06 PHP
php简单构造json多维数组的方法示例
2017/06/08 PHP
Laravel框架实现的批量删除功能示例
2019/01/16 PHP
javascript类继承机制的原理分析
2009/09/12 Javascript
jQuery AJAX实现调用页面后台方法和web服务定义的方法分享
2012/03/01 Javascript
jQuery实现默认是闭合的FAQ展开效果菜单
2015/09/14 Javascript
KnockoutJS 3.X API 第四章之表单value绑定
2016/10/10 Javascript
浅谈jQuery绑定事件会叠加的解决方法和心得总结
2016/10/26 Javascript
vue2.0开发入门笔记之.vue文件的生成和使用
2017/09/19 Javascript
React Native中TabBarIOS的简单使用方法示例
2017/10/13 Javascript
对vue里函数的调用顺序介绍
2018/03/17 Javascript
JS实现贪吃蛇游戏
2019/11/15 Javascript
js删除指定位置超链接中含有百度与360的标题
2021/01/06 Javascript
[01:19:54]DOTA2上海特级锦标赛主赛事日 - 2 败者组第二轮#1Alliance VS EHOME
2016/03/03 DOTA
通过实例浅析Python对比C语言的编程思想差异
2015/08/30 Python
基于Django URL传参 FORM表单传数据 get post的用法实例
2018/05/28 Python
用Pycharm实现鼠标滚轮控制字体大小的方法
2019/01/15 Python
Python函数中不定长参数的写法
2019/02/13 Python
python实现AES加密解密
2019/03/28 Python
python 画二维、三维点之间的线段实现方法
2019/07/07 Python
Python求离散序列导数的示例
2019/07/10 Python
pytorch自定义初始化权重的方法
2019/08/17 Python
运行Python编写的程序方法实例
2020/10/21 Python
python中entry用法讲解
2020/12/04 Python
HTML5 visibilityState属性详细介绍和使用实例
2014/05/03 HTML / CSS
匡威帆布鞋美国官网:Converse美国
2016/08/22 全球购物
介绍一下Linux中的链接
2016/05/28 面试题
网络工程师个人的自我评价范文
2013/10/01 职场文书
保密协议书范本
2014/04/22 职场文书
2014年社区党建工作总结
2014/11/11 职场文书
小学少先队活动总结
2015/05/08 职场文书
2015入党自传格式范文
2015/06/26 职场文书
高中生物教学反思
2016/02/20 职场文书