如何从HDFS中的数据创建EXTERNAL Spark表

时间:2018-04-26 18:46:39

标签: apache-spark hive

我已将HDFS中的镶木桌加载到DataFrame中:

<div class="table"> <div id="radarline"></div> <div class="blips"> <div class="blipping blip" style="margin-left: 300px; top: 300px;"></div> <div class="blipping blip delayedBlip" style="margin-left: 300px; top: 300px;"></div> <div class="blipping blip" style="margin-left: 200px; top: 100px;"></div> <div class="blipping blip delayedBlip" style="margin-left: 200px; top: 100px;"></div> <div class="blipping blip" style="margin-left: 100px; top: 30px;"></div> <div class="blipping blip delayedBlip" style="margin-left: 100px; top: 30px;"></div> <div class="blipping blip" style="margin-left: 400px; top: 250px;"></div> <div class="blipping blip delayedBlip" style="margin-left: 400px; top: 250px;"></div> <div class="blipping blip" style="margin-left: 120px; top: 280px;"></div> <div class="blipping blip delayedBlip" style="margin-left: 120px; top: 280px;"></div> <div class="blipping blip" style="margin-left: 260px; top: 320px;"></div> <div class="blipping blip delayedBlip" style="margin-left: 260px; top: 320px;"></div> <div class="blipping blip" style="margin-left: 280px; top: 400px;"></div> <div class="blipping blip delayedBlip" style="margin-left: 280px; top: 400px;"></div> <div class="blipping blip" style="margin-left: 400px; top: 350px;"></div> <div class="blipping blip delayedBlip" style="margin-left: 400px; top: 350px;"></div> <div class="blipping blip" style="margin-left: 380px; top: 30px;"></div> <div class="blipping blip delayedBlip" style="margin-left: 380px; top: 30px;"></div> <div class="blipping blip" style="margin-left: 170px; top: 200px;"></div> <div class="blipping blip delayedBlip" style="margin-left: 170px; top: 200px;"></div> <div class="blipping blip" style="margin-left: 420px; top: 120px;"></div> <div class="blipping blip delayedBlip" style="margin-left: 420px; top: 120px;"></div> <div class="blipping blip" style="margin-left: 280px; top: 170px;"></div> <div class="blipping blip delayedBlip" style="margin-left: 280px; top: 170px;"></div> <div class="blipping blip" style="margin-left: 350px; top: 210px;"></div> <div class="blipping blip delayedBlip" style="margin-left: 350px; top: 210px;"></div> <div class="blipping blip" style="margin-left: 220px; top: 240px;"></div> <div class="blipping blip delayedBlip" style="margin-left: 220px; top: 240px;"></div> <div class="blipping blip" style="margin-left: 280px; top: 40px;"></div> <div class="blipping blip delayedBlip" style="margin-left: 280px; top: 40px;"></div> </div> </div>

我现在想要将此表公开给Spark SQL,但这必须是一个persitent表,因为我想从JDBC连接或其他Spark Sessions访问它。

快速方法可以是调用val df = spark.read.parquet("hdfs://user/zeppelin/my_table")方法,但在这种情况下,它将实现DataFrame的内容并创建指向Hive Metastore中数据的指针,在HDFS中创建另一个数据副本。

我不想拥有相同数据的两个副本,因此我希望像外部表一样创建指向现有数据。

1 个答案:

答案 0 :(得分:0)

要创建Spark外部表,您必须指定&#34;路径&#34; DataFrameWriter的选项。像这样:

df.write.saveAsTable

问题是,它会清空你的hdfs路径df.write. option("path","hdfs://user/zeppelin/my_mytable"). saveAsTable("my_table") ,从而消除你现有的文件并导致hdfs://user/zeppelin/my_mytable。这看起来像Spark API中的一个错误......

无论如何,对此的解决方法(在Spark 2.3中测试)是从Spark DDL创建外部表。如果你的表有很多列,那么创建DDL可能很麻烦。幸运的是,从Spark 2.0开始,你可以调用DDL org.apache.spark.SparkException: Job aborted.来让spark做一些艰苦的工作。问题是您实际上可以在持久表中运行SHOW CREATE TABLE

如果表非常大,我建议获取表的样本,将其保存到另一个位置,然后获取DDL。像这样:

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)

您希望更改以获得表格的原始名称以及原始数据的路径。您现在可以运行以下命令来创建指向现有HDFS数据的Spark外部表:

CREATE TABLE `my_table_tmp` (`ID` INT, `Descr` STRING)
USING parquet
OPTIONS (
  `serialization.format` '1',
  path 'hdfs:///user/zeppelin/my_table_tmp')