假设有一个分区的hive表
create table hivetbl(a int,b int) partitioned by(c int);
现在如果我们尝试通过Spark DataFrame
插入到表中Seq((1, 2, 3)).toDF("A", "B","C").write.partitionBy("C").insertInto("hivetbl");
抛出
Caused by: java.util.NoSuchElementException: key not found: c
然而,如果我改变dataFrame to
Seq((1, 2, 3)).toDF("a", "b", "c").write.partitionBy("c").insertInto("hivetbl");
数据被加载到表中
spark不应该处理这个在DataFrame和hive表之间发生的大小写不匹配,因为hive不区分大小写?
实际上有很多关于大小写敏感性的讨论,但是从spark 1.5开始(如果我没弄错的话)这是可配置的。
您可以使用以下命令更改Spark SQL的大小写敏感配置:
sqlContext.sql("set spark.sql.caseSensitive=false")
它应该是这样的原因是SQLContext
处理许多类型的数据源,在某些情况下,区分大小写听起来合乎逻辑,在其他情况下,它不是。
我认为错误发生在Spark内部。Spark是区分大小写的,所以在他自己的解释器中,你必须注意这一点,即使它与hadoop系统中的其他应用程序无关。