ハイブで文字列を解析する方法(文字列の連結と解析)

シナリオ:(1)テーブルのフィールドをjson配列に変換し、列をマージしてから、行をマージします。テストテーブルを作成します。1315と11729はテーブル内の特定のフィールドの値が異なる行に属し、123と456は別のフィールドの対応する行番号です。テストデータを準備します。サンプルは次のとおりです:[{"c1": "1315"、 "c2": "123"}、{"c1": "11729"、 "c2": "456"}]。(2)上記の例を表のフィールド値1315と123に分析します。

1.テストデータの作成方法:

1)使用:接続

bからconcat_ws( ':'、 'c1'、a)を選択します   

結果は次のとおりです。

c1:1672
c1:5025
c1:12218

……

2)二重引用符を追加します

select concat( '、'、concat( '\ "'、 'c1'、 '\"')、 ':'、concat( '\ "'、a、 '\"'))kv from b

結果は次のとおりです。

"c1": "1672"
"c1": "5025"
"c1": "12218"

3)追加[{

SELECT CONCAT( '{['、CONCAT(CONCAT( '\ "'、 'c1'、 '\"')、 ':'、CONCAT( '\ "'、a、 '\"'))、 '、' 、CONCAT(CONCAT( '\ "'、 'c2'、 '\"')、 ':'、CONCAT( '\ "'、nvl(b、 '')、 '\"'))、 ']}' )FROM c

結果は次のとおりです。

{["c1": "1672"、 "c2": "14227"]}
{["c1": "12473"、 "c2": ""]}

4)行を結合します(複数のフィールドがある場合は、複数のフィールドをグループ化し、グループ内のフィールドの異なるディメンションに注意してください。これにより、目的の結果がマージされる可能性があります)

SELECT
        id、
        CONCAT( '['、CONCAT_WS( '、'、collect_set(kw))、 ']')AS kw
       FROM
           (SELECT
              medal_id、
              CONCAT(
               '{'
               、CONCAT(
                 CONCAT(CONCAT( '\ "'、 ' c1 '、' \ "')、': '、CONCAT(' \" '、a、' \ "'))、
                 '、 '、
                 CONCAT(CONCAT(' \" '、' c2 '、' \ "' )、 ':'、CONCAT( '\ "'、nvl(b、 '')、 '\"')))
               、 '}')AS kw

           GROUP BYIDから;

結果は次のとおりです。

[{"c1": "6233"、 "c2": "6260"}、{"c1": "6233"、 "c2": "6264"}]

要約すると、テストデータの準備は完了です。

2.json文字列を解析します。

格納されるデータ型は文字列で、メソッドは次のとおりです。最初に[を削除し、次にセパレータ||をプログラムしてから、1行を複数行に変更します。

1)[次のように使用: '^ \\ [(。+)\\] $'、1)、 '\\} \\、\\ {'を削除し、区切り文字を||に変更して、次のように使用します。 \\} \\ | \\ | \\ {'は、それぞれ正規表現関数regexp_extract(str、regexp [、idx])を使用します 

select regexp_replace(regexp_extract(dddd、 '^ \\ [(。+)\\] $'、1)、 '\\} \\、\\ {'、 '\\} \\ | \\ | \\ { ')test_002からのkwとして;

結果は次のとおりです。

{"c1": "12218"、 "c2": ""}
{"c1": "13314"、 "c2": ""} || {"c1": "9192"、 "c2": ""}

2)1行が複数行になります

SELECT a.id、b.kws、c.first、c.second FROM 
     (SELECT id、split(regexp_replace(regexp_extract(dddd、 '^ \\ [(。+)\\] $'、1)、 '\\ } \\、\\ {'、' \\} \\ | \\ | \\ {')、' \\ | \\ | ')AS kw  
     FROM test_002)a
    LATERAL VIEW explode(a.kw)b AS kws ----- 1行を複数行に
    変換するLATERALVIEW json_tuple(b.kws、 'c1'、 'c2')c AS c1、c2; --------文字列Parseからc1、c2を削除しますそれを出します。

結果は次のとおりです。

100006 {"c1": "16"、 "c2": "14"} 1672 14227 100006
{"c1": "473"、 "c2": ""} 473    

 

2. sqlはシェル(またはハイブ-e)で実行および実行されます。ハイブ-eでエスケープ文字\\を実行し、それを\\\\に変更します。テストは不可能です。その後、エスケープ文字\\\を変更します。 \\\、次の例:

SELECT
    id、
    split(
      regexp_replace(
        regexp_extract(cate_condition、 '^ \\\\\\ [(。+)\\\\\\] $'、1)、
        '\\\\\\} \\\\\ \、\\\\\\ {'、' \\\\\\} \\\\\\ | \\\\\\ | \\\\\\ {'
      )、
      ' \\\\\\ | \\\\\\ | '
    )AS kw

おすすめ

転載: blog.csdn.net/limiaoiao/article/details/99674613