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的高级Git库 Gittle
Sep 22 Python
python实现udp数据报传输的方法
Sep 26 Python
基于Python的接口测试框架实例
Nov 04 Python
Python实现对字符串的加密解密方法示例
Apr 29 Python
python文件特定行插入和替换实例详解
Jul 12 Python
Pandas 对Dataframe结构排序的实现方法
Apr 10 Python
python数字图像处理之高级形态学处理
Apr 27 Python
python爬取个性签名的方法
Jun 17 Python
python获取array中指定元素的示例
Nov 26 Python
如何快速一次性卸载所有python包(第三方库)呢
Oct 20 Python
python和C/C++混合编程之使用ctypes调用 C/C++的dll
Apr 29 Python
python index() 与 rindex() 方法的使用示例详解
Dec 24 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自定义hash函数实例
2015/05/05 PHP
用最通俗易懂的代码帮助新手理解javascript闭包 推荐
2012/03/01 Javascript
基于pthread_create,readlink,getpid等函数的学习与总结
2013/07/17 Javascript
JavaScript将取代AppleScript?
2014/09/18 Javascript
javascript 中__proto__和prototype详解
2014/11/25 Javascript
js如何实现淡入淡出效果
2020/11/18 Javascript
跟我学习javascript的undefined与null
2015/11/17 Javascript
浅析Node.js:DNS模块的使用
2016/11/23 Javascript
webpack入门+react环境配置
2017/02/08 Javascript
bootstrap表单按回车会自动刷新页面的解决办法
2017/03/08 Javascript
vue2.0中set添加属性后视图不能更新的解决办法
2019/02/22 Javascript
Vue-cli3简单使用(图文步骤)
2019/04/30 Javascript
Python3正则匹配re.split,re.finditer及re.findall函数用法详解
2018/06/11 Python
Python爬虫包BeautifulSoup实例(三)
2018/06/17 Python
Python函数装饰器常见使用方法实例详解
2019/03/30 Python
Python实现Restful API的例子
2019/08/31 Python
python groupby 函数 as_index详解
2019/12/16 Python
对Pytorch中Tensor的各种池化操作解析
2020/01/03 Python
Django后台管理系统的图文使用教学
2020/01/20 Python
TensorFlow:将ckpt文件固化成pb文件教程
2020/02/11 Python
重写django的model下的objects模型管理器方式
2020/05/15 Python
美国知名平价彩妆品牌:e.l.f. Cosmetics
2017/11/20 全球购物
英国在线花园中心:You Garden
2018/06/03 全球购物
Linux文件系统类型
2012/09/16 面试题
班长岗位职责
2013/11/10 职场文书
学校食堂食品安全责任书
2014/07/28 职场文书
倡议书的写法
2014/08/30 职场文书
2014年团支部工作总结
2014/11/17 职场文书
入党现实表现材料
2014/12/23 职场文书
辞职信怎么写
2015/02/27 职场文书
教师个人师德工作总结2015
2015/05/12 职场文书
运动会运动员赞词
2015/07/22 职场文书
授权协议书范本(3篇)
2019/10/15 职场文书
python OpenCV学习笔记
2021/03/31 Python
Python anaconda安装库命令详解
2021/10/16 Python
PYTHON使用Matplotlib去实现各种条形图的绘制
2022/03/22 Python