【问题标题】:Spark Java append data to Hive tableSpark Java 将数据附加到 Hive 表
【发布时间】:2021-09-20 09:13:16
【问题描述】:

我在尝试将数据附加到配置单元表时遇到了一些问题。 我正确地声明了会话:我可以从表中检索数据

SparkSession spark = SparkSession
                .builder()
                .appName("Java Spark SQL basic example")
                .config("hive.metastore.uris", "thrift://localhost:9083")

                .enableHiveSupport()
                .master("local[*]")
                .getOrCreate();

当尝试使用 df.write().mode(SaveMode.Append).saveAsTable("sample.test_table"); 附加一些数据时,我得到了

Exception in thread "main" java.lang.ClassNotFoundException: Failed to find data source: hive. Please find packages at http://spark.apache.org/third-party-projects.html

我错过了什么?

编辑: 使用 df.write().insertInto("prova2.test_table"); 有效,不知道它是如何工作的

【问题讨论】:

  • 您使用的 spark 和 hive 版本是什么?

标签: java apache-spark hive apache-spark-sql spark-hive


【解决方案1】:

saveAsTable() 似乎无法按您的意愿工作。试试这个吧,

注册一个临时表

df.registerTempTable("sample.temptable")

如果表不存在,则创建并插入数据,

sqlContext.sql("CREATE TABLE IF NOT EXISTS sample.test_table as select * from sample.temptable")

或者简单地创建它而不插入任何值,以便您可以重新运行代码而不会出现任何异常

sqlContext.sql("CREATE TABLE IF NOT EXISTS sample.test_table")

插入数据(表应该存在)

sqlContext.sql("insert into table sample.test_table select * from sample.temptable")

删除临时表

sqlContext.sql("DROP TABLE IF EXISTS sample.temptable")

阅读更多temporary table usage

【讨论】:

  • 谢谢,听起来有点奇怪,但确实有效!
  • 确实如此。很高兴它有帮助。
  • 碰巧,你知道它背后的理性是什么吗?
  • 我不确定,但我猜saveAsTable() 试图做的是创建一个新表。由于该表已经存在,它可能无法这样做。我认为这与insertInto() 也类似。看一下这个。 community.cloudera.com/t5/Support-Questions/…
  • 谢谢,insertInto() 不幸在列位置有一些特殊行为...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多