文件属主不同导致hive加载本地数据失败

hvie加载load本地数据失败分析记录

hive load本地数据由于用户问题找不到文件

1. 问题背景

使用cloudera-cdh5平台下的hive命令行
登录centos的普通用户为xhwl,在~目录下创建了一个文件:waning_case_info
hive中数据库与表均已创建:masi_warning_case.warning_type_info
sudosuroot s u d o s u 进 入 r o o t 用 户 su hdfs
进入hdfs用户
$ hive
进入hive

2. 出错


hive>load data local inpath '/home/xhwl/warning_type_info' into table masi_warning_case.warning_type_info;
FAILED: SemanticException Line 1:23 Invalid path ''/home/xhwl/warning_type_info'': No files matching path file:/home/xhwl/warning_type_info

3. 出错分析

根据上述提示得知:找不到文件
实际上文件是存在的,那为什么找不到?因为文件waning_case_info不是hdfs用户创建的,hdfs访问不到,最终导致load数据到hive表出错

4. 解决

使用xhwl这个普通用户进入hive,执行load数据操作load data local inpath ‘/home/xhwl/warning_type_info’ into table masi_warning_case.warning_type_info;即可
或者使用sudo chown hdfs:hdfs warning_type_info
将这个文件的属主和属组改成hdfs用户,也可以使用hdfs用户进入hive成功load该数据。

### Hive 导入 CSV 文件失败的原因分析与解决方案 #### 1. 编码问题 当从 Hive 表导出数据至 CSV 文件并尝试在 Windows 的 Excel 中打开时,可能会遇到乱码现象。这通常是由于编码不匹配引起的。默认情况下,Hive 使用 UTF-8 编码保存文件,而某些版本的 Excel 可能会自动识别为其他编码格式[^1]。 为了确保正确显示字符,在导出命令中可以指定编码选项: ```bash hive -e "SET hive.resultset.use.unique.column.names=false; SET mapreduce.job.outputformat.class=org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat; select * from table;" | iconv -f utf-8 -t gbk > aa.csv ``` 上述命令通过 `iconv` 工具转换输出流的编码为 GBK 或者适合本地系统的编码形式后再写入目标文件。 #### 2. 字段分隔符处理不当 CSV 文件通常采用逗号作为字段之间的分隔符,但在实际应用中,部分字段内部也可能包含逗号或其他特殊字符。如果不加以妥善处理,则可能导致读取时发生列偏移等问题[^5]。 创建 Hive 外部表时应指明合适的序列化/反序列化工件及其性来解析这些复杂情况下的 CSV 文件结构: ```sql CREATE EXTERNAL TABLE IF NOT EXISTS ext_transaction_details( transaction_id STRING, customer_id STRING, store_id STRING, price STRING, product STRING, date STRING, time STRING ) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' WITH SERDEPROPERTIES ( 'separatorChar' = ',', 'quoteChar' = '"', 'escapeChar' = '\\' ) STORED AS TEXTFILE TBLPROPERTIES ("skip.header.line.count"="1"); ``` 此配置能够有效应对含有嵌套逗号的情况,并利用双引号包裹整个字符串值以防止混淆。 #### 3. 小文件过多影响性能 频繁地将少量记录存入多个小文件内会影响后续查询效率以及集群资源利用率。为了避免这种情况的发生,可以在加载前预聚合原始输入集或将多批次的数据合并成较大的分区再上传给 Hive[^4]。 一种常见的做法是在 ETL 流程里增加一步骤——先收集所有待插入条目到临时缓冲区(比如 HDFS 上的一个大文件),之后一次性提交入库操作;或者调整 MapReduce 框架参数控制 Reduce 阶段产生的文件大小阈值。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值