insertInto方法返回NPE异常

时间:2018-10-30 09:32:09

标签: scala apache-spark hive apache-spark-2.1

我正在尝试创建一个外部表,以从hdfs中的分区实木复合地板文件读取数据。为此,我首先使用以下字符串创建外部表:

spark.sql(
  "CREATE EXTERNAL TABLE IF NOT EXISTS mydb.mytable (col1 int)\n" +
  "PARTITIONED BY (yyyy int, mm int)\n" +
  "STORED AS PARQUET\n" +
  "LOCATION 'hdfs://group/poc/mydata'"
)

正在使用以下两个选项创建一个SparkSession:

spark = SparkSession
      .builder()
      .enableHiveSupport()
      .config(sparkConfigurations)
      .getOrCreate()

def sparkConfigurations = {
    cfg.set("hive.exec.dynamic.partition", "true")
    cfg.set("hive.exec.dynamic.partition.mode", "nonrestrict")
  }

然后,我尝试从数据框中插入此表中的数据:

df.write
  .mode(SaveMode.Append)
  .insertInto("mydb.mytable")

将数据框配置为与配置单元表相同的数据框。

最后一个insertInto引发NullPointerException错误,而没有更多信息。

最糟糕的是,如果我从蜂巢中运行第一个CREATE EXTERNAL TABLE代码,insertInto方法将开始正常工作。

PS:我无法使用saveAsTable方法,因为我使用的是spark 2.1.0,并且直到2.2.0版才支持此方法。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我发现了问题...

当我使用spark.sql创建配置单元表时,它以TBLPROPERTIES的形式添加了一些额外的资料。在这些属性中,有我正在使用的分区列,但大写的列名用小写。

那是返回NPE,所以一旦我将所有内容更改为小写,它便开始工作。