Spark saveAsTable 真的创建了一个表吗?

gfy*_*ytd 5 hive apache-spark

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

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

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

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

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

代码运行良好,没有任何错误,但是当我尝试“从栏选择 *”时,spark 说,

Caused by: org.apache.spark.sql.catalyst.analysis.NoSuchTableException: Table or view 'bar' not found in database 'default';
Run Code Online (Sandbox Code Playgroud)

所以我这里有两个问题,

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

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

非常感谢。

Duy*_*yen 2

检查以下答案:

  1. 如果您只想在 Spark 中创建rawcreateOrReplaceTempView可以帮助您。对于第二部分,请检查下一个答案。
  2. 默认情况下,如果您调用saveAsTable数据帧,如果您使用enableHiveSupport. 如果我们不这样做enableHiveSupport,表将由 Spark 管理,数据将位于spark-warehouse位置。重新启动 Spark 会话后,您将丢失这些表。