1. 本地导入
- (常用)连接hive数据库,读取csv后写入,该方法使用时,df的一列不能均为空值None,否则无法识别数据类型,另外,hive入库的时候会遇到转义字符的问题,尤其是网页爬虫的长文本数据,可以通过
re.escape(str(x))
将字符串转义。
hive_ctx = HiveContext(spark)
df = pd.read_csv(path + file_name, encoding='utf-8')
df = df.fillna('')
values = df.values.tolist()
columns = df.columns.tolist()
df = spark.createDataFrame(values, columns)
df.write.format("Hive").mode(
"overwrite").saveAsTable(DB + "." + table)
- xshell命令
csv文件以逗号分割,当某个字段的格式为:"xxx, yyy, zzz"时,导入hive数据库可能发生错误,需要使用转义字符创建表,命令如下:
create table customs_news(AAA STRING, BBB STRING) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'WITH SERDEPROPERTIES ("separatorChar" = ",","quoteChar" = "\"","escapeChar" = "\\");
创建表后将本地文件导入hive,命令如下:
load data local inpath '/XXX/XXX/XXX.csv' into table customs_news;
2. 导出至本地
- (常用)连接hive数据库,转为pandas后写入csv
df = hiveCtx.sql("select * from data_platform.tender_info_10")
df_1 = df.toPandas()
df_1.to_csv(path + file_name, encoding='utf-8', index=False)
- xshell命令:
hive -e "select * from data_platform.user_dict" > /data/user_dict_2020.5.27.txt
- 连接hive数据库,读取并保存为csv
df = hiveCtx.sql("select * from DB.TABLE")
df.write.format("csv").option("header", "true").mode("overwrite").save("/user/root")
此时,csv保存在hdfs中,需要在xshell中输入以下命令保存至本地
hadoop fs -getmerge /user/root/* XXXXX.csv
3. 新增一列并赋值
采用以下命令新增一列时该列的值是NULL,hive无法通过alter…default …命令赋初始值。
alter table old add columns(colname string) ;
一种办法是:已有旧表old,创建与旧表相同的字段(或自己需要的,如果完全一样可以select *,否则需要指定select的字段)、以及新增的一列col的新表new,采用insert语句赋初始值。
insert into table new select *, 0 as colname from old;
4. 常用命令
常用命令和sql语句基本类似,但hive表没有删除某列、某行数据的sql语句
- 修改表的列名
ALTER TABLE table_name CHANGE old_col_name new_col_name col_type;
- 向表中插入一行数据
insert into user_dict(word) values('XXXX');
- 清空表
truncate table data_platform.user_dict;