持久sparkDataframe

hec6srdp  于 2021-05-27  发布在  Spark
关注(0)|答案(2)|浏览(374)

我对星火世界还不熟悉。如何持久化Dataframe,以便在组件之间使用它。
我有一个kafka流,从中,我通过rdd.tested registerastentable生成Dataframe,但是在另一个程序中无法访问该表。
我想通过sqlcontext访问另一个类中的这个Dataframe,并使用查询结果进行进一步的计算。

osh3o9ms

osh3o9ms1#

您可以将Dataframe的内容保存为Parquet文件,并在另一个程序中读取相同的内容。您可以在下一个程序中注册为临时表。spark sql支持读取和写入Parquet文件,自动保留原始数据的模式。

//First Program
dataframe.write.format("parquet").save("/tmp/xyz-dir/card.parquet")
//where /tmp/xyz-dir/ is a HDFS directory

//Second Program
val parquetRead = sqlContext.read.format("parquet").load("/tmp/xyz-dir/card.parquet")

//Parquet files can also be registered as tables and then used in SQL statements.
parquetRead.registerTempTable("parquettemptable")
val cust= sqlContext.sql("SELECT name FROM parquettemptable")

//After use of parquet file, delete the same in the second program
val fs = org.apache.hadoop.fs.FileSystem.get(new java.net.URI("hdfs://hostname:8030"), sc.hadoopConfiguration)
fs.delete(new org.apache.hadoop.fs.Path("/tmp/xyz-dir"),true) // isRecusrive= true
c9qzyr3d

c9qzyr3d2#

还可以使用saveastable命令将Dataframe作为持久表保存到配置单元元存储中。请注意,使用此功能不需要现有配置单元部署。spark将为您创建一个默认的本地配置单元元存储(使用derby)。与createorreplacetempview命令不同,saveastable将具体化dataframe的内容,并创建指向配置单元元存储中数据的指针。
即使在spark程序重新启动后,只要保持与同一元存储的连接,持久表仍然存在。持久表的Dataframe可以通过使用表的名称在sparksession上调用table方法来创建。
默认情况下,saveastable将创建一个“托管表”,这意味着数据的位置将由metastore控制。删除表时,托管表的数据也将自动删除。

相关问题