【问题标题】:How to split the column with a delimiter based on input column in hive如何根据配置单元中的输入列使用分隔符拆分列
【发布时间】:2021-09-16 13:05:40
【问题描述】:

我有一个基于输入列“lang”的 hive werin 的要求。我在这里寻找语言英语(eng)和法语(fra),此列由分隔符分隔 ';'。它应该从 col1 中选择。 并根据语言将其放在 col_eng 或 col_fra 中。

例如: lang 是 bel;fra;eng ,它应该从以 ';' 分隔的 col1 中选择相应的法语和英语值ABC/WSC;ASA/SAS;ASA/SD 即 col_fra 中的 ASA/SAS 和 col_eng 中的 ASA/SD。

我在下面列出了一些场景。我尝试使用拆分正则表达式并将其放在 case 语句中,但我无法捕获所有这些场景。

例如:

case when lang like ('eng;fra%') then split(mnemonic,';')[0] as mnemonic_eng,split(mnemonic,';')[1] as mnemonic_fr

有没有更好的方法来解决这个问题。以下是所有场景和所需的输出。请您帮忙。

     lang                 col1                  col_eng     col_fra

1   fra;eng             ABC/DEF;EFH/ASD         EFH/ASD      ABC/DEF
2   eng;fra             ABC/DEF;EFH/ASD         ABC/DEF      EFH/ASD
3   bel;fra;eng         ABC/WSC;ASA/SAS;ASA/SD  ASA/SD       ASA/SAS
4   eng;eng;fra         WSX/ASD;WSX/ASD;SEF/DFF WSX/ASD      SEF/DFF
5   eng;fra;rus         QAZ/WER;AST/RS;ASD/DFG  QAZ/WER      AST/RS
6   rum;eng             AQW/WER;WER/DF          WER/DF       null
7   rum;fra;eng         ABC/WSC;ASA/SAS;ASA/SD  ASA/SD      ASA/SAS
8   spa;fra             ASD/AWE;WER/ERT          null       WER/ERT
9   eng                 asd/ert                 asd/ert      null
10  fra                 AWE/ERR                             AWE/ERR
11  fra;eng;rus         ;data_eng;dara_rus     data_eng      null
12  fra;eng             data_fra;                null      data_fra

【问题讨论】:

    标签: csv split hive extract hue


    【解决方案1】:

    你可以使用find_in_set(从1开始)计算'eng'和'fra'的位置,然后应用到split产生的数组中:

    select lang, col1, 
           split(col1,'\073')[find_in_set('eng',regexp_replace(lang,'\073',','))-1] as col_eng,
           split(col1,'\073')[find_in_set('fra',regexp_replace(lang,'\073',','))-1] as col_fra
    

    【讨论】:

    • 非常感谢leftjoin,完美运行
    猜你喜欢
    • 1970-01-01
    • 2013-02-27
    • 2018-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多