ADF中如何通过POST发送Databricks Notebook生成的黄金层数据?
问题排查与解决方案
问题根源
Databricks Notebook活动的默认输出仅包含运行元数据(如runPageUrl、executionDuration等),不会直接返回处理后的Golden层数据集,所以你用@activity('SilverToGoldenBusinessTransformations').output.value会报错——这个属性只存在于Lookup、Get Metadata等返回数据集的活动输出中。
可行解决方案
方案1:让Notebook主动返回需要的数据给ADF
在你的SilverToGoldenBusinessTransformations Notebook末尾,添加代码将需要发送的Golden层数据转换为JSON字符串,通过dbutils.notebook.exit()返回给ADF:
# 假设golden_df是处理后的Golden层DataFrame import json # 转换为JSON数组字符串(注意数据量不能超过1MB,否则会截断) output_data = json.dumps(golden_df.toPandas().to_dict('records')) dbutils.notebook.exit(output_data)
在ADF中:
- ForEach活动的
Items属性使用表达式:@json(activity('SilverToGoldenBusinessTransformations').output.runOutput) - Web Activity的请求体可以保持你原有的写法:
{"id":"@item().id", ...}
方案2:用Lookup活动读取Golden层数据
如果Golden层数据量不大(默认最多10000行,可在Lookup活动配置中调整),可以在Notebook活动后添加一个Lookup活动:
- 配置Lookup活动的数据源为Golden层的Delta/Parquet文件路径
- 确保勾选“First row only”为否,这样会返回所有行数据
- ForEach活动的
Items属性使用:@activity('LookupGoldenLayer').output.value - Web Activity的请求体写法不变即可正常获取字段值
方案3:大数据量场景:在Notebook中直接调用REST API
如果Golden层数据量很大(超过Lookup的行数限制),推荐直接在Databricks Notebook中完成POST请求,避免ADF处理大量数据的性能问题:
import requests import json # golden_df是处理后的Golden层DataFrame records = golden_df.toPandas().to_dict('records') api_url = "你的目标API地址" headers = { "Authorization": "你的授权信息", "Content-Type": "application/json" } # 可根据API支持的批量请求方式调整,比如逐条发送或批量发送 for record in records: response = requests.post(api_url, headers=headers, data=json.dumps(record)) # 可选:添加响应状态检查 response.raise_for_status()
注意事项
- 方案1中
dbutils.notebook.exit()的返回内容大小限制为1MB,数据量超过时优先选方案2或3 - 方案2的Lookup活动最大返回行数为10000,若超过此数值,必须用方案3
内容的提问来源于stack exchange,提问作者lifeofthenoobie
相关产品推荐
相关产品推荐

