SparkSQL应用的一个排错和重构

故事背景

数据处理逻辑:

  1. 将一个json的数组从map结构里面扣出来
  2. 然后将json数组里面的每一个元素和map结构里面的其他元素重新组成一个新的map,存入一个新表

实现方式:采用SparkSQL实现(Spark 3.1.2)
问题:数据少了很多

原始代码逻辑

insert overwrite table iceberg_table
select
    id, 
    map_concat(map_filter(config, (k, v) -> k != 'items'), elem)
from (
    select 
        id, 
        config,
        from_json(config['items'], 'array<map<string,string>>') list
    from table
) as a
LATERAL view explode(list) as elem

怎么发现问题的

  1. 总体条数的减少
  2. 条数不少,但是config这个mapkv个数的减少,采用sum(size(config))

问题

explode的问题

explode的参数如果是null或者数组为空的时候,整行记录都会被清除掉,而不是用一个null来补充数据,而且如果你缺省设置为 array()也是不行的,因为这个数组为空,这行数据还是会被清除掉的

map_concat的问题

map_concat如果传入的后续参数里面有null的话,整个函数的返回值也是为null

总结

基于以上2点的问题,导致了数据的大量减少

调整之后的逻辑

初版

insert overwrite table iceberg_table
select
    id, 
    map_concat(map_filter(config, (k, v) -> k != 'items'), COALESCE(elem, map()))
from (
    select 
        id, 
        config,
        from_json(config['items'], 'array<map<string,string>>') list
    from table
) as a
LATERAL view 
    explode(COALESCE(if(size(list)=0, null, list), array(null))) as elem

这版可以看到,我们需要在2个地方进行修改

终版

切入点:将2处修改合并到一处

insert overwrite table iceberg_table
select
    id, 
    map_concat(map_filter(config, (k, v) -> k != 'items'), elem)
from (
    select 
        id, 
        config,
        from_json(config['items'], 'array<map<string,string>>') list
    from table
) as a
LATERAL view 
explode(COALESCE(if(size(list)=0, null, list), array(map())) as elem
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • www.DataCamp.com[http://www.DataCamp.com] 中有很多数据科学家的cheat...
    wong11阅读 848评论 0 1
  • 30.域的含义 域英文叫DOMAIN——域(Domain)是Windows网络中独立运行的单位,域之间相互访问则需...
    saluch阅读 131评论 0 0
  • 之前学习MyBatis整理了一些笔记,笔记分为四个部分:1.MyBatis应用分析与实践[https://www....
    javacoo阅读 1,046评论 0 2
  • 17.分区分桶的区别,为什么要分区 分区表:原来的一个大表存储的时候分成不同的数据目录进行存储。如果说是单分区表,...
    qydong阅读 619评论 0 0
  • 一、Hive基本概念 Hive 是基于 Hadoop 的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提...
    CJ21阅读 1,766评论 0 13