You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何加速从Teradata SQL向Databricks Notebook加载海量数据?

提升Teradata到Databricks数据加载速度的优化方案

1. 仅查询必需字段,减少数据传输

不要用SELECT *拉取所有列,只保留业务实际需要的字段,直接降低需要传输的数据量:

regressors_query = '''SELECT col1, col2, col3 -- 替换为你实际需要的字段
FROM DATA_SCI_APP_OWN.HCA_DS_FIN_RX_C01 
WHERE PLAN_DIM_CK = ''' + plan_num + ''' AND PRODUCT = ''' + prod_id + ''''''

2. 改用参数化查询,优化Teradata执行计划

当前字符串拼接SQL不仅有注入风险,还可能导致Teradata无法复用执行计划。改用参数化查询,同时确认过滤字段的索引情况:

# 适配teradata.get_data的参数化写法(如果支持)
regressors_query = '''SELECT 所需字段
FROM DATA_SCI_APP_OWN.HCA_DS_FIN_RX_C01 
WHERE PLAN_DIM_CK = ? AND PRODUCT = ?'''
regressors = ps.DataFrame(teradata.get_data(regressors_query, params=(plan_num, prod_id)))

务必确认PLAN_DIM_CK和PRODUCT字段有联合索引,没有的话联系Teradata管理员创建,这会极大加速查询过滤效率

3. 分批拉取数据,避免一次性加载全量

针对超大规模数据集,按分区字段(如主键范围、日期)拆分查询,分批次加载后合并:

batch_size = 100000  # 根据数据量调整批次大小
start_key = 0
regressors = None

while True:
    # 假设有自增主键ID_COL,按范围分批
    batch_query = f'''SELECT 所需字段
    FROM DATA_SCI_APP_OWN.HCA_DS_FIN_RX_C01 
    WHERE PLAN_DIM_CK = {plan_num} AND PRODUCT = {prod_id}
    AND ID_COL BETWEEN {start_key} AND {start_key + batch_size}'''
    
    batch_df = ps.DataFrame(teradata.get_data(batch_query))
    if batch_df.empty:
        break
    
    if regressors is None:
        regressors = batch_df
    else:
        regressors = pd.concat([regressors, batch_df], ignore_index=True)
    
    start_key += batch_size + 1

4. 切换到Databricks原生Teradata连接器

放弃用pandas单进程拉取,改用Databricks的JDBC连接器直接读取到Spark DataFrame,利用分布式处理能力:

# 配置Teradata JDBC连接
jdbc_url = "jdbc:teradata://<TERADATA_HOST>/DATABASE=DATA_SCI_APP_OWN,CHARSET=UTF8,COMPRESS=ON"
conn_properties = {
    "user": "<你的用户名>",
    "password": "<你的密码>",
    "driver": "com.teradata.jdbc.TeraDriver"
}

# 直接读取为Spark DataFrame(适合海量数据的分布式处理)
spark_df = spark.read.jdbc(
    url=jdbc_url,
    table="(SELECT 所需字段 FROM HCA_DS_FIN_RX_C01 WHERE PLAN_DIM_CK = ? AND PRODUCT = ?) AS temp_table",
    properties=conn_properties,
    predicates=[f"PLAN_DIM_CK = {plan_num} AND PRODUCT = {prod_id}"]
)

# 如果需要转为pandas DataFrame,可在分布式处理后再转换
regressors = spark_df.toPandas()

Spark的分布式读取比pandas单进程效率提升数倍,尤其针对TB级数据

5. 启用数据压缩,降低网络传输负载

在JDBC连接参数中开启压缩,或者在Teradata端配置查询结果压缩,减少网络传输的数据体积:
比如在JDBC URL中添加COMPRESS=ON参数,Teradata会自动压缩查询结果后传输。

6. 排查网络瓶颈

确认Databricks集群与Teradata服务器的网络带宽是否充足,尽量将Databricks集群部署在与Teradata同区域的云环境中,避免跨区域网络延迟。

内容的提问来源于stack exchange,提问作者az_peer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 12:03:15