Python使用Zoominfo API检查Amazon Redshift中的公司基本信息字段的数据正确性,存储到Boolean类型的字段中,查不到的在指定字段中设置为false,否则设置为true。
技术栈
- 数据库连接 :
psycopg2
:用于连接Amazon Redshift(兼容PostgreSQL协议)。
- API调用 :
requests
:调用Zoominfo API。
- 数据处理 :
pandas
:批量处理查询结果(可选,适用于大数据量场景)。
- 环境管理 :
boto3
:从AWS Secrets Manager或Parameter Store获取敏感信息(如API密钥)。
- 部署与调度 :
- AWS Lambda:无服务器执行环境。
- Amazon EventBridge:定时触发Lambda。
- 日志与监控 :
- AWS CloudWatch:记录运行日志和错误信息。
实现流程
- 环境配置 :
- 将Zoominfo API密钥和Redshift连接信息存储在AWS Secrets Manager中。
- 数据提取 :
- 从Redshift中提取待验证的公司数据(如
company_name
、address
等字段)。 - 过滤条件:仅处理未验证的记录(如
is_valid IS NULL
)。
- 从Redshift中提取待验证的公司数据(如
- API调用 :
- 对每条公司数据调用Zoominfo的Company Enrichment API。
- 根据API响应判断数据是否存在,设置
is_valid
为True
或False
。
- 数据更新 :
- 将结果批量更新回Redshift的对应表中。
- 错误处理 :
- 记录API调用失败或数据库操作异常。
- 支持重试机制(如指数退避)。
关键Python代码
1. 从AWS Secrets Manager获取密钥
python
import boto3
import json
def get_secret(secret_name):
client = boto3.client('secretsmanager')
response = client.get_secret_value(SecretId=secret_name)
return json.loads(response['SecretString'])
2. 连接Amazon Redshift
python
import psycopg2
def connect_redshift():
secrets = get_secret('redshift_credentials')
conn = psycopg2.connect(
host=secrets['host'],
port=secrets['port'],
dbname=secrets['dbname'],
user=secrets['username'],
password=secrets['password']
)
return conn
3. 调用Zoominfo API
python
import requests
def check_company_validity(company_name, address):
api_key = get_secret('zoominfo_api_key')['API_KEY']
headers = {'Authorization': f'Bearer {api_key}'}
params = {
'companyName': company_name,
'address': address,
'matchCriteria': 'basic' # 根据API文档调整参数
}
try:
response = requests.get(
'https://api.zoominfo.com/company/enrich',
headers=headers,
params=params,
timeout=10
)
if response.status_code == 200:
return response.json().get('matchStatus') == 'Matched' # 根据实际响应调整
return False
except requests.exceptions.RequestException:
return False
4. 主处理逻辑
python
def lambda_handler(event, context):
conn = connect_redshift()
cursor = conn.cursor()
# 查询待处理数据
cursor.execute("""
SELECT company_id, company_name, address
FROM companies
WHERE is_valid IS NULL
LIMIT 1000 # 分批次处理
""")
rows = cursor.fetchall()
# 处理每条记录
updates = []
for row in rows:
company_id, name, address = row
is_valid = check_company_validity(name, address)
updates.append((is_valid, company_id))
# 批量更新
cursor.executemany("""
UPDATE companies
SET is_valid = %s
WHERE company_id = %s
""", updates)
conn.commit()
cursor.close()
conn.close()
注意事项
- API限流 :
- 使用
time.sleep()
或令牌桶算法控制请求频率。
- 使用
- 批量操作 :
- 使用
pandas
优化大数据量场景(如分页查询)。
- 使用
- 错误重试 :
- 对失败的API调用实现重试逻辑(如
tenacity
库)。
- 对失败的API调用实现重试逻辑(如
- 安全合规 :
- 通过IAM角色限制Redshift和Secrets Manager的访问权限。
- 日志跟踪 :
- 记录关键指标(如处理时长、成功率)到CloudWatch。
python
# 示例:增加重试逻辑(需安装 tenacity)
from tenacity import retry, stop_after_attempt, wait_exponential
@retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1))
def check_company_validity_with_retry(name, address):
return check_company_validity(name, address)