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 稀疏矩阵-sparse 存储和转换
May 27 Python
Python上下文管理器和with块详解
Sep 09 Python
Python set常用操作函数集锦
Nov 15 Python
Python3一行代码实现图片文字识别的示例
Jan 15 Python
Python运维之获取系统CPU信息的实现方法
Jun 11 Python
python贪吃蛇游戏代码
Apr 18 Python
django 自定义过滤器的实现
Feb 26 Python
详解python中的线程与线程池
May 10 Python
python不相等的两个字符串的 if 条件判断为True详解
Mar 12 Python
解决python cv2.imread 读取中文路径的图片返回为None的问题
Jun 02 Python
python中逻辑与或(and、or)和按位与或异或(&、|、^)区别
Aug 05 Python
python 多进程和协程配合使用写入数据
Oct 30 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的一些小问题
2010/07/03 PHP
析构函数与php的垃圾回收机制详解
2013/10/28 PHP
php输出xml必须header的解决方法
2014/10/17 PHP
几个优化WordPress中JavaScript加载体验的插件介绍
2015/12/17 PHP
Laravel 5.3 学习笔记之 配置
2016/08/28 PHP
php操作路径的经典方法(必看篇)
2016/10/04 PHP
ThinkPHP5.0框架控制器继承基类和自定义类示例
2018/05/25 PHP
php 多继承的几种常见实现方法示例
2019/11/18 PHP
解决jquery插件冲突的问题
2014/01/23 Javascript
基于Three.js插件制作360度全景图
2016/11/29 Javascript
简单实现AngularJS轮播图效果
2020/04/10 Javascript
nodejs multer实现文件上传与下载
2017/05/10 NodeJs
vue-cli 组件的导入与使用教程详解
2018/04/11 Javascript
解决vue.js 数据渲染成功仍报错的问题
2018/08/25 Javascript
angular2组件中定时刷新并清除定时器的实例讲解
2018/08/31 Javascript
Node.js HTTP服务器中的文件、图片上传的方法
2019/09/23 Javascript
python paramiko实现ssh远程访问的方法
2013/12/03 Python
Python基于回溯法子集树模板解决全排列问题示例
2017/09/07 Python
python调用OpenCV实现人脸识别功能
2018/05/25 Python
Python一行代码实现快速排序的方法
2019/04/30 Python
Python+Tensorflow+CNN实现车牌识别的示例代码
2019/10/11 Python
python 遗传算法求函数极值的实现代码
2020/02/11 Python
Python 判断时间是否在时间区间内的实例
2020/05/16 Python
Python 测试框架unittest和pytest的优劣
2020/09/26 Python
日本著名的平价时尚女性购物网站:Fifth
2016/08/24 全球购物
AHAVA美国官方网站:死海海泥护肤品牌
2016/10/18 全球购物
Raffaello Network西班牙:意大利拉斐尔时尚购物网
2019/03/12 全球购物
美国木工工具和用品商店:Woodcraft
2019/10/30 全球购物
一些Unix笔试题和面试题
2012/09/25 面试题
电工技术比武方案
2014/05/11 职场文书
租车协议书范本2014
2014/11/17 职场文书
张思德观后感
2015/06/09 职场文书
工作年限证明范本
2015/06/15 职场文书
大学运动会加油稿
2015/07/22 职场文书
聘任书格式及范文
2015/09/21 职场文书
Oracle 多表查询基本语法实例
2022/04/18 Oracle