火花流持久表更新

时间:2018-05-09 19:58:25

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

我有一个Spark结构化流媒体应用程序(听kafka),它也是从s3中的持久性表中读取的,我试图让每个微量分析检查表的更新。我试过了

var myTable = spark.table("myTable!")

spark.sql("select * from parquet.`s3n://myFolder/`")

两者都不能在流媒体环境中工作。问题是镶木地板文件在每次更新时都在变化,而spark不会运行任何正常的刷新命令,例如:

spark.catalog.refreshTable("myTable!")
spark.sqlContext.clearCache()

我也尝试过:

spark.sqlContext.setConf("spark.sql.parquet.cacheMetadata","false")
  spark.conf.set("spark.sql.parquet.cacheMetadata",false)

没有解脱。必须有一种方法来做到这一点。改为使用jdbc连接到数据库会更聪明吗?

2 个答案:

答案 0 :(得分:0)

假设我正确地读你,我相信问题是因为DataFrame是不可变的,除非你重新启动流式查询并创建一个新的DataFrame,否则你看不到对镶木桌的更改。这个问题有come up on the Spark Mailing List before。确切的答案似乎是捕获这些更新的唯一方法是restart the streaming query。如果您的应用程序无法忍受10秒的打嗝,您可以查看此博客文章,其中总结了上述对话并讨论了SnappyData enables mutations on Spark DataFrames的方式。

免责声明:我为SnappyData工作

答案 1 :(得分:0)

这将完成我正在寻找的东西。

val df1Schema = spark.read.option("header", "true").csv("test1.csv").schema
    val df1 = spark.readStream.schema(df1Schema).option("header", "true").csv("/1")
    df1.writeStream.format("memory").outputMode("append").queryName("df1").start()

    var df1 = sql("select * from df1")

缺点是它的附加。解决一个问题是根据ID和最新日期删除重复项。

val dfOrder = df1.orderBy(col("id"), col("updateTableTimestamp").desc)

val dfMax = dfOrder.groupBy(col("id")).agg(first("name").as("name"),first("updateTableTimestamp").as("updateTableTimestamp"))