我有一个来自HDFS的流,我需要将它与同样包含在HDFS中的元数据(两个木地板)一起加入。
我的元数据有时会更新,我需要加入最新的内容,这意味着理想情况下,每个流微批次都从HDFS读取元数据。
我试图对此进行测试,但是不幸的是,即使我尝试使用spark.sql.parquet.cacheMetadata=false
,Spark也会在缓存了文件(假定是)之后读取元数据。
有没有一种方法可以读取每个微型批次?不是我要找的Foreach Writer?
以下代码示例:
spark.sql("SET spark.sql.streaming.schemaInference=true")
spark.sql("SET spark.sql.parquet.cacheMetadata=false")
val stream = spark.readStream.parquet("/tmp/streaming/")
val metadata = spark.read.parquet("/tmp/metadata/")
val joinedStream = stream.join(metadata, Seq("id"))
joinedStream.writeStream.option("checkpointLocation", "/tmp/streaming-test/checkpoint").format("console").start()
/tmp/metadata/ got updated with spark append mode.
据我了解,通过JDBC jdbc source and spark structured streaming访问元数据时,Spark将查询每个微型批次。
答案 0 :(得分:0)
据我发现,有两种选择:
创建临时视图并使用间隔刷新它:
metadata.createOrReplaceTempView(“ metadata”)
并在单独的线程中触发刷新:
<service_name>.<stack_name>
注意:在这种情况下,spark只会读取相同的路径,如果您需要从HDFS上的其他文件夹中读取元数据,例如Spark带有时间戳等。
这种方式不适合我,因为我的元数据可能每小时刷新几次。