【发布时间】:2019-04-03 07:25:44
【问题描述】:
我正在尝试创建一个外部表来从 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")
作为 df 与 hive 表具有相同架构的数据框。
最后一个 insertInto 引发 NullPointerException 错误,没有更多信息。
最糟糕的是,如果我从 hive 运行第一个 CREATE EXTERNAL TABLE 代码,insertInto 方法开始运行良好。
PS:我无法使用 saveAsTable 方法,因为我使用的是 spark 2.1.0,并且直到 2.2.0 版本才支持此方法。
感谢您的帮助。
【问题讨论】:
-
请包含回溯。
-
它返回一个NullPointerException,所以和日志没有太多关系。我已经在研究它了,问题就在我解释的时候发生了
-
又该如何知道哪个组件抛出了NPE?
-
insertInto 方法返回一个 NPE
-
这并没有真正缩小范围。
标签: scala apache-spark hive apache-spark-2.1