坚持Spark Dataframe

时间:2016-10-26 00:07:41

标签: scala apache-spark apache-spark-sql spark-streaming spark-dataframe

我是Spark世界的新手。我们如何坚持Dataframe以便我们可以跨组件使用它。

我有一个Kafka流,我通过Rdd.Tried RegisterAsTempTable生成Dataframe,但该表在其他程序中无法访问。

我想通过sqlContext在另一个类中访问此Dataframe,并使用查询结果进行进一步的计算。

2 个答案:

答案 0 :(得分:2)

使用 saveAsTable 命令,DataFrame也可以{Hout Metastore {/ 3>}作为Hive Metastore的持久表。请注意,使用此功能不需要现有的Hive部署。 Spark将为您创建默认的本地Hive Metastore(使用Derby)。与createOrReplaceTempView命令不同,saveAsTable将实现DataFrame的内容并创建指向Hive Metastore中数据的指针。

即使您重新启动Spark程序,持久表仍然存在,只要您保持与同一Metastore的连接即可。可以通过使用表的名称调用SparkSession上的table方法来创建持久表的DataFrame。

默认情况下,saveAsTable将创建一个“托管表”,这意味着数据的位置将由Metastore控制。当删除表时,托管表也会自动删除它们的数据。

答案 1 :(得分:1)

您可以将DataFrame的内容保存为Parquet文件,并在另一个程序中读取相同内容。您可以在下一个程序中注册为Temp表.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