2017-12-01 7 views
0

I持つJSON欄のようなj:プレストからエキス、すべてのJSONのキー

{'a': 2, 'b': {'b1': 3, 'b2': 5}} 
{'c': 3, 'a': 5} 
{'d': 1, 'c': 7} 

どのように私はすべての異なる(トップレベル)を取得することができますキーの名前?私。私は

['a', 'b', 'c', 'd'] 

を返すために、

select distinct foo(j) 

のようなもの(この例では、私は、ネストされたキーを使用して、あまりにも心配していないんだということに注意してください)

Presto documentation明示的にフィットする任意の機能を持っていません請求書。近くに見えるのはJSONPathの構文ですが、これは不正確なようです。以下の少なくとも1 何かを返しますが、すべては私のためプレストに失敗しなければならない。さらに

select json_extract(j, '$.*') 
select json_extract(j, '$..*') 
select json_extract(j, '$[*]') 
select json_extract(j, '*') 
select json_extract(j, '..*') 
select json_extract(j, '$*.*') 

、私はこれはj(すなわち、[2, 3, 5, 3, 5, 1, 7])から、キー、をしませ返します疑います。

答えて

1

あなたはmap_keys(cast(json_column as map<varchar,json>))

    1. エキスJSONのトップレベルのキーは、後で、あなたがSELECT DISTINCT明確なトップレベルのキーを取得することができますCROSS JOIN UNNEST
    2. を使用してキーのコレクションを「フラット化」することができます。

    一緒に本置く例:

    presto> SELECT DISTINCT m.key 
        -> FROM (VALUES JSON '{"a": 2, "b": {"b1": 3, "b2": 5}}', JSON '{"c": 3, "a": 5}') 
        ->  example_table(json_column) 
        -> CROSS JOIN UNNEST (map_keys(CAST(json_column AS map<varchar,json>))) AS m(key); 
    key 
    ----- 
    a 
    b 
    c 
    (3 rows) 
    
  • +0

    Anはあなたの列が ' '{ "A" のようなvarchar''として格納されている場合という条件を追加しました: "B"、2:{ "B1":3 (JSONとしてのjson_column) ' – MichaelChirico

    +0

    ' CROSS(json_column) 'がなければこれを行う方法はありますか? JOIN'? 10億行以上のDBでは、これは非常に遅いです。 – MichaelChirico

    +0

    私のアプローチは次のとおりです。私が実行できるデータの十分な小さな部分を拡大します(700万行のように36個のユニークキーが見つかりました)。より広いクエリに 'key_found_from_narrow_query'句を 'どこにもない'句を追加します。 1)これは、実際には、データセット全体で一意のキーを見つけるより優れたアプローチです2)これをスケールで実装するためのより良い/少ない反復方法がありますか? – MichaelChirico

    関連する問題