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 zip文件 压缩
Dec 24 Python
Python3中的2to3转换工具使用示例
Jun 12 Python
在Python程序和Flask框架中使用SQLAlchemy的教程
Jun 06 Python
virtualenv实现多个版本Python共存
Aug 21 Python
Python SQLite3简介
Feb 22 Python
Python之列表实现栈的工作功能
Jan 28 Python
对python For 循环的三种遍历方式解析
Feb 01 Python
python3.7 openpyxl 删除指定一列或者一行的代码
Oct 08 Python
使用python制作一个解压缩软件
Nov 13 Python
Python利用 utf-8-sig 编码格式解决写入 csv 文件乱码问题
Feb 21 Python
django queryset 去重 .distinct()说明
May 19 Python
Python 使用dict实现switch的操作
Apr 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
php下使用无限生命期Session的方法
2007/03/16 PHP
php 数学运算验证码实现代码
2009/10/11 PHP
Javascript中找到子元素在父元素内相对位置的代码
2012/07/21 Javascript
iframe实用操作锦集
2014/04/22 Javascript
ActiveX控件与Javascript之间的交互示例
2014/06/04 Javascript
jQuery中val()方法用法实例
2014/12/25 Javascript
JavaScript中的lastIndexOf()方法使用详解
2015/06/06 Javascript
JS数组合并push与concat区别分析
2015/12/17 Javascript
JS获取当前使用的浏览器名字以及版本号实现方法
2016/08/19 Javascript
使用JS实现图片展示瀑布流效果(简单实例)
2016/09/06 Javascript
Bootstrap Modal遮罩弹出层(完整版)
2016/11/21 Javascript
JS判断是否为JSON对象及是否存在某字段的方法(推荐)
2016/11/29 Javascript
详解vue slot插槽的使用方法
2017/06/13 Javascript
Vue内容分发slot(全面解析)
2017/08/19 Javascript
深入浅析ES6 Class 中的 super 关键字
2017/10/20 Javascript
微信小程序图片选择区域裁剪实现方法
2017/12/02 Javascript
Bootstrap实现的表格合并单元格示例
2018/02/06 Javascript
js 数组详细操作方法及解析合集
2018/06/01 Javascript
记一次webpack3升级webpack4的踩坑经历
2018/06/12 Javascript
vue、react等单页面项目部署到服务器的方法及vue和react的区别
2018/09/29 Javascript
nodejs文件夹深层复制功能
2019/09/03 NodeJs
javascript操作元素的常见方法小结
2019/11/13 Javascript
在vue中对数组值变化的监听与重新响应渲染操作
2020/07/17 Javascript
对numpy中的数组条件筛选功能详解
2018/07/02 Python
python得到电脑的开机时间方法
2018/10/15 Python
Python面向对象程序设计之继承、多态原理与用法详解
2020/03/23 Python
Python之字典添加元素的几种方法
2020/09/30 Python
函授本科自我鉴定
2013/11/03 职场文书
你懂得怎么写自荐信吗?
2013/12/27 职场文书
桥梁工程专业求职信
2014/04/21 职场文书
2014年九一八事变演讲稿
2014/09/14 职场文书
2014年关工委工作总结
2014/11/17 职场文书
python 用递归实现通用爬虫解析器
2021/04/16 Python
python保存图片的四个常用方法
2022/02/28 Python
Python开发五子棋小游戏
2022/04/28 Python
springboot+rabbitmq实现智能家居实例详解
2022/07/23 Java/Android