如何加速从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
相关产品推荐
相关产品推荐

