利用DataWorks 中的odpspy3提取JSON中的信息
先来看一个例子
[{"projectName":"默认价格","price":"3.15"},{"projectName":"A项目","price":"2.92"},{"projectName":"B项目","price":"2.92"}]
- 如上所示,这是一个JSON字符串,但是这里的JSON字符串是不规范的,当我们要使用的时候,是不能直接读取的,我们将来要读取的字符串类似于这样的
| projectName | price|
|A项目|2.92|
| 默认价格 | 3.15 |
但是我们又不能直接读取,这个时候,我们可以借助于Python脚本来处理数据,脚本如下
import json
from datetime import datetime
from odps import ODPS
from odps.df import DataFrame
from odps.models import Schema
# 获取表对象
table = o.get_table('表名')
# 将表转换为 DataFrame
df = DataFrame(table)
# 使用参数 bizdate 替代固定分区值
bizdate = '${bdp.system.bizdate}' # 这里可以替换为您需要的业务日期参数
# 筛选具有指定 bizdate 分区的数据
filtered_df = df[df.pt == bizdate]
# 使用SQL查询处理数据,而不是下载到本地
all_data = filtered_df.select(filtered_df.price_json, filtered_df.product_code)
# 准备解析后的数据
parsed_data_all = []
# 解析JSON数据
for data in all_data.execute():
json_data = data.price_json
product_code = data.product_code
parsed_item = json.loads(json_data)
for entry in parsed_item:
price = entry.get('price', 'N/A')
project_name = entry.get('projectName', 'N/A')
parsed_data_all.append({'product_code': product_code, 'price': price, 'projectName': project_name})
# 获取当前时间的格式化时间字符串
current_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
# 创建新的数据表并确定其模式
new_table_schema = Schema.from_lists(['product_code', 'projectName', 'price', 'timestamp'], ['string', 'string', 'string', 'string'])
# 检查表 'table_B' 是否存在,如果不存在则创建
if 'table_B' not in o.list_tables():
o.create_table('table_B', new_table_schema)
else:
# 如果表存在,获取目标表对象
target_table = o.get_table('table_B')
# 清空现有数据
target_table.truncate()
# 获取目标表对象(如果上面没有创建而是清空的数据)
target_table = o.get_table('table_B')
# 准备要写入的数据,添加时间戳列
data_to_write = [(data['product_code'], data['projectName'], data['price'], current_time) for data in parsed_data_all]
# 写入数据到目标表
with target_table.open_writer() as writer:
for row in data_to_write:
writer.write(row)
print("数据处理结果已成功写入到表B中。")
最后我们得到的结果就类似于我刚才表格列取的那样