利用DataWorks 中的odpspy3提取JSON中的信息

利用DataWorks 中的odpspy3提取JSON中的信息

先来看一个例子

 [{"projectName":"默认价格","price":"3.15"},{"projectName":"A项目","price":"2.92"},{"projectName":"B项目","price":"2.92"}]
  1. 如上所示,这是一个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中。")


最后我们得到的结果就类似于我刚才表格列取的那样

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值