.csv 不是 Select Hive Query 上的 SequenceFile 错误

Posted

技术标签:

【中文标题】.csv 不是 Select Hive Query 上的 SequenceFile 错误【英文标题】:.csv not a SequenceFile error on Select Hive Query 【发布时间】:2021-09-08 23:41:53 【问题描述】:

我是 Spark 和 Scala 的新手 ;)

代码总结:

从 CSV 文件中读取数据 --> 在 2 个文件上创建简单的内部连接 ​​--> 将数据写入 Hive 表 --> 在集群上提交作业

请您帮忙找出问题所在。 代码并不复杂。 该作业在集群上执行良好。 因此,当我尝试可视化写在 hive 表上的数据时,我遇到了问题。

hive> select * from Customers limit 10;

失败并出现异常 java.io.IOException:java.io.IOException: hdfs://m01.itversity.com:9000/user/itv000666/warehouse/updatedcustomers.db/customers/part-00000-348a54cf -aa0c-45b4-ac49-3a881ae39702_00000.c000 .csv 不是序列文件

object LapeyreSparkDemo extends App 
  
  //Getting spark ready
  val sparkConf = new SparkConf()
  sparkConf.set("spark.app.name","Spark for Lapeyre")
  
  //Creating Spark Session
  val spark = SparkSession.builder()
                          .config(sparkConf)
                          .enableHiveSupport()
                          .config("spark.sql.warehouse.dir","/user/itv000666/warehouse")
                          .getOrCreate()                       
  Logger.getLogger(getClass.getName).info("Spark Session Created Successfully")
  
  //Reading
  Logger.getLogger(getClass.getName).info("Data loading in DF started")
  val ordersSchema = "orderid Int, customerName String, orderDate String, custId Int, orderStatus 
  String, age String, amount Int" 
  val orders2019Df = spark.read
  .format("csv")
  .option("header",true)
  .schema(ordersSchema)
  .option("path","/user/itv0006666/lapeyrePoc/orders2019.csv")
  .load
  val newOrder = orders2019Df.withColumnRenamed("custId", "oldCustId")
                             .withColumnRenamed("customername","oldCustomerName")
   
  val orders2020Df = spark.read
  .format("csv")
  .option("header",true)
  .schema(ordersSchema)
  .option("path","/user/itv000666/lapeyrePoc/orders2020.csv")
  .load
  
  Logger.getLogger(getClass.getName).info("Data loading in DF complete")
  
  //processing
  Logger.getLogger(getClass.getName).info("Processing Started")
  val joinCondition = newOrder.col("oldCustId") === orders2020Df.col("custId")
  val joinType = "inner"
  val joinData = newOrder.join(orders2020Df, joinCondition, joinType)
                             .select("custId","customername")
  
  //Writing
  
  spark.sql("create database if not exists updatedCustomers")
                  
  joinData.write
  .format("csv")
  .mode(SaveMode.Overwrite)
  .bucketBy(4, "custId")
  .sortBy("custId")
  .saveAsTable("updatedCustomers.Customers")
                        
  //Stopping Spark Session
  spark.stop()



如果需要更多信息,请告诉我。 提前致谢。

【问题讨论】:

您可以将describe extended 的结果添加到问题中吗?也许会有所帮助。 DESCRIBE [DATABASE] [FORMATTED|EXTENDED] object_name 【参考方案1】:

这是罪魁祸首

joinData.write
.format("csv")

改为使用它并且它有效。

joinData.write
.format("Hive")

由于我正在将数据写入 hive 表(orc 格式),格式应该是“Hive”而不是 csv

另外,不要忘记在创建 spark 会话时启用配置单元支持。 此外,在 spark 2 中,不支持 bucketby 和 sortby。也许在 Spark 3 中确实如此。

【讨论】:

以上是关于.csv 不是 Select Hive Query 上的 SequenceFile 错误的主要内容,如果未能解决你的问题,请参考以下文章

Hive Query 在 Select 中具有多列并按一列分组

hive表数据导出到csv乱码原因及解决方案

Presto on Search of normal select query[non partitioned hive table]给出列$path在数据库默认表<Table>中不存在

HIVE数据导出CSV

将 hive 查询输出拆分为逗号分隔值

在生产数据库上运行解释 <insert query in hive> 是不是安全