公司的数据存放在HDFS上,但是模型的训练时需要用到这部分数据,于是就有了数据同步的需求。以下是个人整理的数据同步流程,仅适用于公司内部,其他地方由于环境不同可能不可用。
数据从Hive同步到JupyterLab
通过Hive查看数据文件位置
可以通过Hive的show create table(建表语句)查看数据库表的路径:
show create table tmp_db.my_table_name
执行后可查询到数据文件路径,例如:
'viewfs://dcfs/user/hive/warehouse/tmp_db/my_table_name'
实际对应的位置则为:/user/hive/warehouse/tmp_db/my_table_name
通过HDFS 命令同步数据到JupyterLab
在Jupyterlab中打开Terminal然后输入如下命名(路径为上一步Hive查询到的路径):
hdfs dfs -copyToLocal /user/hive/warehouse/tmp_db/my_table_name ./
hdfs dfs命令详解
查看文件常用命令
- hdfs dfs -ls path 查看文件列表
- hdfs dfs -lsr path 递归查看文件列表
- hdfs dfs -du path 查看path下的磁盘情况,单位字节
创建文件夹
- hdfs dfs -mkdir path
注:该命令可递归创建文件夹,不可重复创建,在Linux文件系统中不可见
创建文件
- hdfs dfs -touchz path
注:该命令不可递归创建文件即当该文件的上级目录不存在时无法创建该文件,可重复创建但会覆盖原有的内容
复制文件和目录
- hdfs dfs -cp 源目录 目标目录
移动文件和目录
- hdfs dfs -mv 源目录 目标目录
赋予权限
- hdfs dfs -chmod [权限参数][拥有者][:[组]] path
上传文件
- hdfs dfs -put 源文件夹 目标文件夹
类似命令:
- hdfs dfs -copyFromLocal 源文件夹 目标文件夹 作用同put
- hdfs dfs -moveFromLocal 源文件夹 目标文件夹 上传后删除本地
下载文件
- hdfs dfs -get源文件夹 目标文件夹
类似命令
- hdfs dfs -copyToLocal 源文件夹 目标文件夹 作用同get
- hdfs dfs -moveToLocal 源文件夹 目标文件夹 get后删除源文件
删除文件
- hdfs dfs -rm 目标文件
- hdfs dfs -rmr 目标文件 递归删除(慎用)
通过Pandas读取同步的文件
import pandas as pd import glob file_list = glob.glob('my_table_name/*') df_list = [] for file in file_list: df_temp = pd.read_csv(file, sep='\001', header=None, na_values=['\\N']) df_list.append(df_temp) df = pd.concat(df_list, ignore_index=True) df.to_csv('output.csv')
注意:
- sep为HDFS存储的数据的间隔符号
- na_values为HDFS文件中NULL值的符号
数据从jupyterlab同步到Hive仓库
通过hdfs命令将Jupyter中的文件写入到HDFS
hdfs dfs -mkdir /user/hive/warehouse/tmp_db/poi_info hdfs dfs -copyFromLocal -f poi_info.csv /user/hive/warehouse/tmp_db/poi_info/
通过HIVE创建表并关联上数据
create external table if not exists tmp_db.poi_info ( poi_id bigint, poi_name string, lat string, lon string ) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\001' LOCATION '/user/hive/warehouse/tmp_db/poi_info/';
备注:
- ROW FORMAT DELIMITED FIELDS TERMINATED BY 需要指名CSV的字段间隔符号。