我已将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中创建另一个数据副本。
我不想拥有相同数据的两个副本,因此我希望像外部表一样创建指向现有数据。
答案 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')