要创建 Spark 外部表,您必须指定 DataFrameWriter 的“路径”选项。像这样的:
df.write.
option("path","hdfs://user/zeppelin/my_mytable").
saveAsTable("my_table")
但问题是,它会清空您的 hdfs 路径 hdfs://user/zeppelin/my_mytable,从而消除您现有的文件,并导致 org.apache.spark.SparkException: Job aborted.。这看起来像是 Spark API 中的一个错误...
无论如何,解决方法(在 Spark 2.3 中测试)是创建一个外部表,但来自 Spark DDL。如果您的表有很多列,则创建 DDL 可能会很麻烦。幸运的是,从 Spark 2.0 开始,您可以调用 DDL SHOW CREATE TABLE 让 spark 完成工作。问题是您实际上可以在持久表中运行SHOW CREATE TABLE。
如果表很大,我建议获取表的样本,将其保存到另一个位置,然后获取 DDL。像这样的:
// Create a sample of the table
val df = spark.read.parquet("hdfs://user/zeppelin/my_table")
df.limit(1).write.
option("path", "/user/zeppelin/my_table_tmp").
saveAsTable("my_table_tmp")
// Now get the DDL, do not truncate output
spark.sql("SHOW CREATE TABLE my_table_tmp").show(1, false)
你会得到一个像这样的 DDL:
CREATE TABLE `my_table_tmp` (`ID` INT, `Descr` STRING)
USING parquet
OPTIONS (
`serialization.format` '1',
path 'hdfs:///user/zeppelin/my_table_tmp')
您希望将其更改以具有表的原始名称和原始数据的路径。您现在可以运行以下命令来创建指向现有 HDFS 数据的 Spark 外部表:
spark.sql("""
CREATE TABLE `my_table` (`ID` INT, `Descr` STRING)
USING parquet
OPTIONS (
`serialization.format` '1',
path 'hdfs:///user/zeppelin/my_table')""")