如何在Databricks笔记本的Scala单元格中引用Python单元格的变量?
需求可行性说明
该需求完全可实现,Databricks同一笔记本内不同语言的单元格共享同一个Spark会话,你可以通过以下两种常用方式跨语言传递变量:
方法1:通过Spark共享配置传递(适合单值、简单类型场景)
这是传递数值、字符串等简单变量最简便的方式:
- 修改Python单元格,计算完成后将变量值写入Spark配置
batdf = spark.sql(f"""select cast((from_unixtime((timestamp/1000), 'yyyy-MM-dd HH:mm:ss')) as date) as event_date,(from_unixtime((timestamp/1000), 'yyyy-MM-dd HH:mm:ss')) as event_datetime, * from testable """) srcRecCount = batdf.count() # 新增:将计算结果存入Spark全局配置,key可自定义,避免与Spark内置配置重名即可 spark.conf.set("custom.src_rec_count", str(srcRecCount))
- 修改Scala单元格,从Spark配置中读取值替换原有硬编码
%scala import java.time._ // 读取Python传入的计数值并转成Long类型 val srcRecCount: Long = spark.conf.get("custom.src_rec_count").toLong val endPart = LocalDateTime.now() val endPartDelta = endPart.toString.substring(0,19) dbutils.notebook.exit(s"""{'date':'$endPartDelta', 'srcRecCount':'$srcRecCount'}""")
方法2:通过临时视图传递(适合多值、复杂类型场景)
如果需要传递多个变量或者复杂结构数据,用临时视图更通用稳定:
- 修改Python单元格,计算完成后创建临时视图存储结果
batdf = spark.sql(f"""select cast((from_unixtime((timestamp/1000), 'yyyy-MM-dd HH:mm:ss')) as date) as event_date,(from_unixtime((timestamp/1000), 'yyyy-MM-dd HH:mm:ss')) as event_datetime, * from testable """) srcRecCount = batdf.count() # 新增:创建只有一行的临时视图存储结果 spark.createDataFrame([(srcRecCount,)], ["src_rec_count"]).createOrReplaceTempView("temp_src_stats")
- 修改Scala单元格,从临时视图中读取变量值
%scala import java.time._ // 读取临时视图获取计数值 val srcRecCount: Long = spark.sql("select src_rec_count from temp_src_stats").head().getLong(0) val endPart = LocalDateTime.now() val endPartDelta = endPart.toString.substring(0,19) dbutils.notebook.exit(s"""{'date':'$endPartDelta', 'srcRecCount':'$srcRecCount'}""")
内容的提问来源于stack exchange,提问作者SanjanaSanju
相关产品推荐
相关产品推荐

