Spark写入Hive表后执行select查询报.csv not a SequenceFile错误求助
问题根因
报错核心原因是Hive元数据中记录的updatedCustomers.Customers表存储格式和你实际写入HDFS的文件格式不匹配:
- 你在Spark代码中指定写入格式为
.format("csv"),所以HDFS上实际存储的是CSV文本文件 - 但Hive的表元数据默认将该表的输入格式标记为了SequenceFile,Hive执行查询时尝试用SequenceFile的解析逻辑读取CSV文件,因此抛出格式不匹配错误
解决方案
方案1:写入时指定Hive可识别的CSV配置(推荐,无需修改查询逻辑)
修改Spark写入部分的代码,显式指定CSV表的序列化/反序列化配置,让Hive元数据可以正确识别文件格式:
joinData.write .format("csv") .mode(SaveMode.Overwrite) // 新增以下3行配置,指定Hive用CSV SerDe解析文件 .option("serde", "org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe") .option("field.delim", ",") .option("header", "false") // 写入的CSV带表头就设为true,不带则设为false .bucketBy(4, "custId") .sortBy("custId") .saveAsTable("updatedCustomers.Customers")
如果不需要强制用CSV格式存储,也可以直接把写入格式改成Hive默认支持的列式存储格式,查询性能更好:
// 把format改成parquet或者orc,Hive默认可以直接识别,无需额外配置 joinData.write .format("parquet") .mode(SaveMode.Overwrite) .bucketBy(4, "custId") .sortBy("custId") .saveAsTable("updatedCustomers.Customers")
方案2:临时指定格式查询(仅用于临时验证,不推荐长期使用)
如果不想修改Spark代码重跑作业,可以在Hive查询时显式指定存储格式,但每次查询都需要加配置参数:
SELECT * FROM updatedCustomers.Customers ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' WITH SERDEPROPERTIES ( 'field.delim' = ',', 'serialization.format' = ',' ) LIMIT 10;
额外注意事项
你当前代码中读取2019年订单文件的路径为/user/itv0006666/lapeyrePoc/orders2019.csv,比2020年文件路径多了一个数字6,请检查是否为路径笔误,避免出现读取文件失败的问题。
内容的提问来源于stack exchange,提问作者Rohit Patil
相关产品推荐
相关产品推荐

