繁体   English   中英

从 Databricks 中的 UDF 内部查询 Delta Lake

[英]Querying Delta Lake from Inside of UDF in Databricks

需要在结构化流中对 UDF 内的表执行一些查询。 问题是,在 UDF 中,如果我尝试使用spark.sql ,我将收到 null 指针异常。 跟随这里的最佳方式是什么。

基本上我需要从一个表中获取 stream,然后使用该数据从另一个表中执行一些范围查询。

例如。

val appleFilter = udf((appleId : String) => {
     val query = "select count(*) from appleMart where appleId='"+appleId+"'"
     val appleCount = spark.sql(query).collect().head.getLong(0)
     (appleCount>0)
})

val newApple = apples.filter(appleFilter($"appleId"))

对于此任务,这并不是真正正确的方法 - 您不应该从 UDF 内部执行单独的查询,因为 Spark 无法并行化/优化它们。

更好的方法是在流媒体 dataframe 和appleMart dataframe 之间进行连接——这将允许 Spark 优化所有操作。 据我从您的代码中了解到,您只需要检查您是否拥有给定 ID 的苹果。 在这种情况下,您可以只进行内部连接——这将只留下appleMart中有行的 ID,如下所示:

val appleMart = spark.read.format("delta").load("path_to_delta")
val newApple = apples.join(appleMart, apples("appleId") === appleMart("appleId"))

如果由于某种原因你需要留下appleMart中不存在的apples条目,你可以使用left join 代替......

PS 如果appleMart不是经常变化,可以缓存一下。 虽然,对于流式作业, 从性能的角度来看,对于查找表,如 Cassandra 可能更好

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM