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加pyGame实现的简单拼图游戏实例
May 15 Python
python编写简单爬虫资料汇总
Mar 22 Python
对变量赋值的理解--Pyton中让两个值互换的实现方法
Nov 29 Python
Python基于jieba库进行简单分词及词云功能实现方法
Jun 16 Python
Django开发中的日志输出的方法
Jul 02 Python
用python标准库difflib比较两份文件的异同详解
Nov 16 Python
python使用PyQt5的简单方法
Feb 27 Python
pytz格式化北京时间多出6分钟问题的解决方法
Jun 21 Python
python全栈知识点总结
Jul 01 Python
python 单线程和异步协程工作方式解析
Sep 28 Python
Django xadmin开启搜索功能的实现
Nov 15 Python
python用WxPython库实现无边框窗体和透明窗体实现方法详解
Feb 21 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给每个段落添加空格的方法
2015/03/20 PHP
Yii框架学习笔记之session与cookie简单操作示例
2019/04/30 PHP
JavaScript获取GridView选择的行内容
2009/04/14 Javascript
浏览器脚本兼容 文本框中,回车键触发事件的兼容
2010/06/21 Javascript
JavaScript基本编码模式小结
2012/05/23 Javascript
javascript中注册和移除事件的4种方式
2013/03/20 Javascript
输入自动提示搜索提示功能的使用说明:sugggestion.txt
2013/09/02 Javascript
jQuery ajax请求返回list数据动态生成input标签,并把list数据赋值到input标签
2016/03/29 Javascript
最佳的JavaScript错误处理实践
2016/07/16 Javascript
AngularJS  $modal弹出框实例代码
2016/08/24 Javascript
div实现自适应高度的textarea实现angular双向绑定
2017/01/08 Javascript
ionic 3.0+ 项目搭建运行环境的教程
2017/08/09 Javascript
基于node.js express mvc轻量级框架实践
2017/09/14 Javascript
select标签设置默认选中的选项方法
2018/03/02 Javascript
JavaScript中toLocaleString()和toString()的区别实例分析
2018/08/14 Javascript
使用canvas实现一个vue弹幕组件功能
2018/11/30 Javascript
ES6 Promise对象的含义和基本用法分析
2019/06/14 Javascript
关于layui导航栏不展示下拉列表的解决方法
2019/09/25 Javascript
JavaScript Window窗口对象属性和使用方法
2020/01/19 Javascript
django 创建过滤器的实例详解
2017/08/14 Python
python爬虫_微信公众号推送信息爬取的实例
2017/10/23 Python
Python中按键来获取指定的值
2019/03/02 Python
python线程定时器Timer实现原理解析
2019/11/30 Python
Python运行提示缺少模块问题解决方案
2020/04/02 Python
Python参数传递对象的引用原理解析
2020/05/22 Python
python 通过 pybind11 使用Eigen加速代码的步骤
2020/12/07 Python
CSS3田字格列表的样式编写方法
2018/11/22 HTML / CSS
YSL圣罗兰美妆美国官网:Yves Saint Lauret US
2016/11/21 全球购物
Nobody Denim官网:购买高级女士牛仔裤
2021/03/15 全球购物
医学专业五年以上个人求职信
2013/12/03 职场文书
优秀毕业自我鉴定
2014/02/15 职场文书
纺织工程专业推荐信
2014/09/08 职场文书
教师师德师风整改措施
2014/10/24 职场文书
教师群众路线教育实践活动学习笔记
2014/11/05 职场文书
2016社区平安家庭事迹材料
2016/02/26 职场文书
sql server删除前1000行数据的方法实例
2021/08/30 SQL Server