【问题标题】:Persisting Spark Dataframe持久化 Spark 数据框
【发布时间】:2016-10-26 00:07:40
【问题描述】:

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

我有一个 Kafka 流,我通过 Rdd.Tried RegisterAsTempTable 从中生成数据帧,但在另一个程序中无法访问该表。

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

【问题讨论】:

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


    【解决方案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
    

    【讨论】:

    • val cdrDF = rdd.map(PaymentProcessor.parseCallCreditCardRecord).toDF() \ 当我尝试 cdrDF.saveAsParquetFile("datafile.parquet","/tmp/xyz-dir/") 时,我是看到编译器错误。如果我在这里遗漏了什么,请指导我。
    • @BindumaliniKK saveAsParquetFile 已弃用(自 1.4.0 版起)使用 write.parquet(path) see1.3 approach,Arvind 请相应修改
    • 我面临异常:INFO org.apache.spark.sql.execution.datasources.parquet.ParquetRelation - 列表文件:/SparkSpace/PaymentCardFraudResearch/card.parquet 上的驱动程序异常在线程“main”java .lang.AssertionError:断言失败:未找到预定义架构,在文件:/SparkSpace/PaymentCardFraudResearch/card.parquet 下未找到 Parquet 数据文件或摘要文件。在 scala.Predef$.assert(Predef.scala:179)
    • / 写作:cdrDF.write.parquet("card.parquet") 阅读为:val parquetRead = sqlContext.read.parquet("card.parquet")
    • @ArvindKumar:我们是否需要添加任何依赖项:因为我遇到异常:原因:java.lang.ClassNotFoundException:org.apache.spark.sql.execution.datasources.FileFormat .I我正在关注更新的代码 sn-p。
    【解决方案2】:

    DataFrames 也可以使用 saveAsTable 命令将 saved 作为持久表保存到 Hive 元存储中。请注意,使用此功能不需要现有的 Hive 部署。 Spark 将为您创建一个默认的本地 Hive 元存储(使用 Derby)。与 createOrReplaceTempView 命令不同,saveAsTable 将具体化 DataFrame 的内容并创建指向 Hive 元存储中数据的指针。

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

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

    【讨论】:

    • 我也尝试了 SaveAsTable("tablename")。但是,当我尝试使用 sqlContext 在另一个程序中获取表时,再次出现未找到表的异常。
    • 我在一次讨论中了解到,使用 hivecontext 而不是 sqlcontext 将保留可以跨组件访问的表。所以我创建了 HiveContect 并使用了 hiveContext.saveTable("table" )。我对 Hive 了解不多。对指导我如何配置元存储很有帮助。
    • 您是否已经安装了配置单元?如果已经存在,你应该已经有了 Metastore
    • No.Not installed.Just using this artifact :spark-hivecontext-compatibility_2.10
    • 根据我上面的帖子,您不需要安装 hive,spark 将为您创建本地 hive 元存储,使用 saveAsTable 并尝试再次访问,如果您发现任何问题,请告诉我。跨度>
    猜你喜欢
    • 2021-03-07
    • 1970-01-01
    • 1970-01-01
    • 2020-03-12
    • 2016-06-24
    • 2018-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多