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日志记录模块实例及改进
Feb 12 Python
python制作小说爬虫实录
Aug 14 Python
Python 异常处理的实例详解
Sep 11 Python
python中如何正确使用正则表达式的详细模式(Verbose mode expression)
Nov 08 Python
Python搭建FTP服务器的方法示例
Jan 19 Python
Python 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)
Mar 19 Python
Python全排列操作实例分析
Jul 24 Python
pycham查看程序执行的时间方法
Nov 29 Python
python中dict()的高级用法实现
Nov 13 Python
Python object类中的特殊方法代码讲解
Mar 06 Python
python+adb命令实现自动刷视频脚本案例
Apr 23 Python
Python还能这么玩之用Python修改了班花的开机密码
Jun 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
动态网站web开发 PHP、ASP还是ASP.NET
2006/10/09 PHP
PH P5.2至5.5、5.6的新增功能详解
2014/07/14 PHP
php使用GD实现颜色渐变实例
2015/06/02 PHP
php中smarty区域循环的方法
2015/06/11 PHP
一实用的实现table排序的Javascript类库
2007/09/12 Javascript
用Javascript数组处理多个字符串的连接问题
2009/08/20 Javascript
Jquery实现三层遍历删除功能代码
2013/04/23 Javascript
多种方式实现JS调用后台方法进行数据交互
2013/08/20 Javascript
jQuery中DOM树操作之复制元素的方法
2015/01/23 Javascript
javascript模拟命名空间
2015/04/17 Javascript
浅谈利用JavaScript进行的DDoS攻击原理与防御
2015/06/04 Javascript
js实现简单的联动菜单效果
2015/08/19 Javascript
javascript实现禁止复制网页内容汇总
2015/12/30 Javascript
javascript数组去重方法分析
2016/12/15 Javascript
ECMAScript6 新特性范例大全
2017/03/24 Javascript
vue给input file绑定函数获取当前上传的对象完美实现方法
2017/12/15 Javascript
vue组件详解之使用slot分发内容
2018/04/09 Javascript
微信小程序实现城市列表选择
2018/06/05 Javascript
在react中使用vuex的示例代码
2018/07/30 Javascript
微信小程序实现滑动操作代码
2020/04/23 Javascript
angula中使用iframe点击后不执行变更检测的问题
2020/05/10 Javascript
VUE UPLOAD 通过ACTION返回上传结果操作
2020/09/07 Javascript
js实现3D粒子酷炫动态旋转特效
2020/09/13 Javascript
Python按钮的响应事件详解
2019/03/04 Python
Numpy对数组的操作:创建、变形(升降维等)、计算、取值、复制、分割、合并
2019/08/28 Python
使用css3实现的windows8开机加载动画
2014/12/09 HTML / CSS
美国婚礼和派对礼品网站:Kate Aspen(新娘送礼会、迎婴派对)
2018/03/28 全球购物
杭州联环马网络笔试题面试题
2013/08/04 面试题
类和结构的区别
2012/08/15 面试题
构造方法和其他方法的区别
2016/04/26 面试题
爱情寄语大全
2014/04/09 职场文书
2014年环境整治工作总结
2014/12/10 职场文书
2015年社区关工委工作总结
2015/04/03 职场文书
小学生光盘行动倡议书
2015/04/28 职场文书
关于的python五子棋的算法
2022/05/02 Python
python缺失值填充方法示例代码
2022/12/24 Python