spark saveAsTable 真的会创建一个表吗?

Posted

技术标签:

【中文标题】spark saveAsTable 真的会创建一个表吗?【英文标题】:Does spark saveAsTable really create a table? 【发布时间】:2019-01-23 08:28:23 【问题描述】:

这可能是一个愚蠢的问题,因为缺乏一些火花的基本知识,我试试这个:

SparkSession spark = SparkSession.builder().appName("spark ...").master("local").enableHiveSupport().getOrCreate();
Dataset<Row> df = spark.range(10).toDF();
df.write().saveAsTable("foo");  

这会在 Hive 的“默认”数据库下创建表,当然,我可以随时从表中获取数据。

我更新了上面的代码以摆脱“enableHiveSupport”,

SparkSession spark = SparkSession.builder().appName("spark ...").master("local").getOrCreate();
Dataset<Row> df = spark.range(10).toDF();
df.write().saveAsTable("bar"); 

代码运行良好,没有任何错误,但是当我尝试“select * from bar”时,spark 说,

Caused by: org.apache.spark.sql.catalyst.analysis.NoSuchTableException: Table or view 'bar' not found in database 'default';

所以我这里有两个问题,

1) 是否可以创建一个“原始”火花表,而不是配置单元表?我知道Hive像mysql一样维护数据库中的元数据,spark也有类似的机制吗?

2) 在第二个代码sn-p中,调用saveAsTable时spark实际创建了什么?

非常感谢。

【问题讨论】:

【参考方案1】:

检查下面的答案:

    如果您只想在 spark 中创建 raw 表,createOrReplaceTempView 可以帮助您。对于第二部分,请检查下一个答案。 默认情况下,如果您在数据帧上调用saveAsTable,如果您使用enableHiveSupport,它会将表持久化到 Hive 元存储中。如果我们不enableHiveSupport,表将由 Spark 管理,数据将在spark-warehouse 位置下。重新启动 spark 会话后,您将丢失这些表。

【讨论】:

您好,registerTempTable 已弃用,请改用 createOrReplaceTempView(viewName)。但是 createOrReplaceTempView 没有帮助,我的意思是,就像 saveAsTable 一样,我无法在新会话中从中获取数据。 感谢您的提醒,如果您想从新会话中获取表,我们必须使用 hive 支持

以上是关于spark saveAsTable 真的会创建一个表吗?的主要内容,如果未能解决你的问题,请参考以下文章

Spark 数据框 saveAsTable 正在使用单个任务

为啥 Spark DataFrame 会创建错误数量的分区?

在 Spark 的 saveAsTable 上

Spark SaveAsTable 元数据更新慢

Spark 2.x saveAsTable

Spark:可以使用 DataFrame.saveAsTable 或 DataFrameWriter.options 传递哪些选项?