SQL生成JSON
1.拼接json背景
作为数仓同学,除了给业务方搭建看板、建设宽表等,同时也会给后端推送数据,应用在产品展示中,一般在推数之前后端同学会提供MQ Topic及Address,用于数据传输,数据传输可通过数据集成工具(Sea Tunnel),或Flink进行消息推送,因此需要数仓同学将数据转化为JSON格式。
2.消息任务开发流程
因此开发任务为3个
任务1:开发出业务需要的数据可以是明细、也可以是指标(逻辑由产品+业务出),任务命名为dwd_xxxx_di/df or ads_xxxx
任务2:将数据转化成json格式(就是接下来要说的),任务命名为dwd_xxxx_json_di/df or ads_xxxx_json
建议大家在做json表时候留个key,要不后续定位json数据时候,你还需要get_json_object,同时在开发时候注意json内容和后端要求的映射。
任务3:建设数据集成 or Flink任务
dev环境推送后和后端及测试确认推数情况(可能由于json格式不对(符号多/少)导致message被拦截 推送数据失败)
如果是纯实时可通过Flink SQL操作,同理也是3个任务,或者一个任务中通过多source完成,具体时效看业务要求(30min/1h/t+1都有可能)
hive2mq/kafka
3.样例数据
这里还是以一个社区动态数据为例子,我们要把用户在社区发布数据展示在平台中,供内容审核人员去审核。
原表结构数据为
with tt1 as ( select '语兴好物好鞋分享' as tag ,'Asics JOG 100 2 轻便透气入门级专业跑步鞋 黑武士 男女同款' as spu_list ,'' as circle ,'动态图文' as content_type ,'APP发布' as source ,'[]' as ocr_result ,'{}' as video_result ) select tag ,spu_list ,circle ,content_type ,source ,ocr_result ,video_result from tt1
生成json目标为:
{ "tag": "语兴好物好鞋分享", "spuList": "Asics JOG 100 2 轻便透气入门级专业跑步鞋 黑武士 男女同款 ", "circle": "", "contentType": "动态图文", "source": "APP发布", "ocrResult": "[]", "videoResult": "{}" }
4.to_json+map组合拼接(最快最直接办法)
with tt1 as ( select '语兴好物好鞋分享' as tag ,'Asics JOG 100 2 轻便透气入门级专业跑步鞋 黑武士 男女同款' as spu_list ,'' as circle ,'动态图文' as content_type ,'APP发布' as source ,'[]' as ocr_result ,'{}' as video_result ) select to_json( map('tag',tag, 'spuList',spu_list, 'circle',circle, 'contentType',content_type, 'source',source, 'ocrResult',ocr_result, 'videoResult',video_result ) ) from tt1
通过json.cn或其他json查看工具可查看json拼接是否准确
5.concat(纯手拼,比较费力但结构完全可按照自己方式来)
原数据如下,还是社区数据
with tt2 as ( select 242165710 as content_id ,'xhs' as content_source ,'图文' as content_type ,'时尚简约长裤,轻松驾驭任何风格👖' as content_title ,'时尚简约长裤,轻松驾驭任何风格👖。优质面料,裁剪利落,无论是搭配牛仔裤还是衬衫,都不失格调,让你从人群中脱颖而出' as content ,'xxxxx' as content_url ,4353412 as publish_user_id ,'xx' as tag_list ,'xxx' as tag_name_list ,'425436' as spu_id_list ,'xx牛仔裤' as spu_name_list ,'xxx' as spu_url ,'2024-11-23 01:20:34' as publish_time )
目标是拼接如下内容
with tt2 as ( select 242165710 as content_id ,'xhs' as content_source ,'图文' as content_type ,'时尚简约长裤,轻松驾驭任何风格👖' as content_title ,'时尚简约长裤,轻松驾驭任何风格👖。优质面料,裁剪利落,无论是搭配牛仔裤还是衬衫,都不失格调,让你从人群中脱颖而出' as content ,'xxxxx' as content_url ,4353412 as publish_user_id ,'xx' as tag_list ,'xxx' as tag_name_list ,'425436' as spu_id_list ,'xx牛仔裤' as spu_name_list ,'xxx' as spu_url ,'2024-11-23 01:20:34' as publish_time ) , tt3 as ( select content_id ,content_source ,content_type ,content_title ,content ,content_url ,publish_user_id ,tag_name_list ,spu_id_list ,spu_name_list ,spu_url ,image_url ,publish_time ,concat('话题id:',tag_list,'<br>','话题name:',tag_name_list) as extra ,to_json( map( 'spuIdList:',spu_id_list, 'spuNameList:',spu_name_list, 'spuUrl:',spu_url ) ) as extra2 from tt2 ) select cast(t0.content_id as string) as content_id ,concat(concat('{' ,'\"contentId\":\"',md5(concat('社区数据',publish_user_id,cast(content_id as string))),'\",' ,'\"contentId\":\"',content_id,'\",' ,'\"contentSource\":\"',content_source,'\",' ,'\"contentType\":\"',content_type,'\",' ,'\"contentTitle\":\"',content_title,'\",' ,'\"content\":\"',content,'\",' ,'\"contentExtra\":"',GET_JSON_OBJECT(TO_JSON(map('extra',extra)),'$.extra'),'",' ,'\"spuExtra\":',extra2,',' ,'\"contentUrl\":\"',content_url,'\",' ,'\"publishTime\":\"',UNIX_TIMESTAMP(publish_time),'\",' ,'\"publishUserId\":\"',cast(publish_user_id as string),'\",' ,'}' ) ) FROM tt3
这里再提一下为什么选择flink去传而不是数据同步工具,因为数据同步工具会给json内部list或json(json套json)加引号给引起来,因此最后传给后端可能就不是一个json体。
6.GPT实现
费时费力就面向GPT编程(GPT 4o、豆包、文心、kimi都行,没有广告!!!),prompt如下:
使用hive sql 将如下内容拼接成一个字段的json体,with tt2 as ( select 242165710 as content_id ,'xhs' as content_source ,'图文' as content_type ,'时尚简约长裤,轻松驾驭任何风格👖' as content_title ,'时尚简约长裤,轻松驾驭任何风格👖。优质面料,裁剪利落,无论是搭配牛仔裤还是衬衫,都不失格调,让你从人群中脱颖而出' as content ,'xxxxx' as content_url ,4353412 as publish_user_id ,'[xx,xxx,xx]' as tag_name_list ,'[425436]' as spu_id_list ,'[xx牛仔裤]' as spu_name_list ,'[xxx]' as spu_url ,'[xxxx,xxx]' as image_url )#数据人的面试交流地##数据人offer决赛圈怎么选##java##数据分析##数据开发#