[英]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.