当DataFrame和Hive Table中的字段名大小写不匹配时,Spark Sql 1.6 Key找不到



假设有一个分区的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系统中的其他应用程序无关。

最新更新