!文章内容如有错误或排版问题,请提交反馈,非常感谢!
公司的数据存放在 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 的字段间隔符号。