【问题标题】:insertInto method returns NPE exceptioninsertInto 方法返回 NPE 异常
【发布时间】: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


【解决方案1】:

我找到了问题...

当我使用 spark.sql 创建 hive 表时,它会以 TBLPROPERTIES 的形式添加一些额外的文献。在这些属性中,有我使用的分区列,但是是大写的,列名是小写的。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多