代码之家  ›  专栏  ›  技术社区  ›  ankit pundir

HIveQL:是否有任何方法可以使用所附图像中提到的SQL将分号分隔的值转换为多列

  •  0
  • ankit pundir  · 技术社区  · 6 年前

    Red Shows the input and green depicts the required output.

    vasm列具有多个由分号分隔的人员的值(用户名和id)。要求将用户名和id分隔为两个不同的列。请建议如何在HiveQL或SQL中执行此操作。

    2 回复  |  直到 6 年前
        1
  •  0
  •   trincot    6 年前

    您可以使用 split 函数创建字符串数组,然后选择每个数组元素:

    with base as (
          select split(vasm, ";") as part
          from   mytable
    )
    select part[0] as vasm_fullname, part[1] as vasm_username
    from base
    
        2
  •  0
  •   ankit pundir    6 年前

    这是我的需求解决方案版本。如果有任何优化是可能的,那么请让我知道。

    带底座 作为( 选择不同的大小写 当c.vasm像“%;%”时 然后拆分(c.vasm,“;”) 当c.vasm与“%”相似时,%' 然后拆分(c.vasm,“,”) ELSE拆分(c.vasm,“^”) 作为零件结束 来自gcs\U阶段。apjgc\u seller\u report\u renewals c其中c.vasm不为空 ) 选择 第[1]部分为空时的情况 那么 substr(修剪(零件[0]),1,instr(修剪(零件[0]),'(')-1) 其他 concat((substr(trim(part[0]),1,instr(trim(part[0]),'(')-1)),(concat(',',',(substr(trim(part[1]),1,instr(trim(part[1]),'(')-1))) 以vasm\U全名结尾, 第[1]部分为空时的情况 那么 substr(trim(part[0])、instr(trim(part[0])、'(')+1、(instr(trim(part[0])、')))-instr(trim(part[0])、'(')-1) 其他 concat((substr(trim(part[0])、instr(trim(part[0])、'(')+1、(instr(trim(part[0])、'))-instr(trim(part[0])、'(')-1))、(concat('、'、'、'(substr(trim(part[1])、instr(trim(part[1])、'(')+1、(instr(trim(part[1])、'))-instr(trim(part[1])、'(')-1()))))))) 以vasm\U用户名结尾
    从底座开始;