我正在尝试创建一个外部表,以从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版才支持此方法。
感谢您的帮助。
答案 0 :(得分:0)
我发现了问题...
当我使用spark.sql创建配置单元表时,它以TBLPROPERTIES的形式添加了一些额外的资料。在这些属性中,有我正在使用的分区列,但大写的列名用小写。
那是返回NPE,所以一旦我将所有内容更改为小写,它便开始工作。