17

私は最新(0.117)のPrestoを使用しており、このような複雑なJSON配列でCROSS JOIN UNNESTを実行しようとしています。

[{"id": 1, "value":"xxx"}, {"id":2, "value":"yy"}, ...]

そのために、最初にidの値でARRAYを作成しようとしました

SELECT CAST(JSON_EXTRACT('[{"id": 1, "value":"xxx"}, {"id":2, "value":"yy"}]', '$..id') AS ARRAY<BIGINT>)

しかし、うまくいきません。

idの値を抽出するための最適な JSON パスは何ですか?

4

4 に答える 4

5

これで、 presto-third-functionsを使用できます。関数を提供し、次のjson_array_extractように json 配列情報を抽出できます。

    select 
           json_array_extract_scalar(arr1, '$.book.id') 
    from 
           (values ('[{"book":{"id":"12"}}, {"book":{"id":"14"}}]')) t(arr1)

出力は次のとおりです。

    [12, 14]
于 2016-07-25T02:53:36.523 に答える
2

最終的に、それらを抽出するための単純な JSON パスを見つけることをあきらめました。

代わりに、次のような冗長なダーティ クエリを作成して、タスクを完了させました。

SELECT
  ...
FROM
  (
    SELECT
      SLICE(ARRAY[
        JSON_EXTRACT(json_column, '$[0].id'),
        JSON_EXTRACT(json_column, '$[1].id'),
        JSON_EXTRACT(json_column, '$[2].id'),
        ...
      ], JSON_ARRAY_LENGTH(json_column)) ids
    FROM
     the.table
  ) t1
  CROSS JOIN UNNEST(ids) AS t2(id)
WHERE
  ...

それらをCROSS JOINする別の良い方法を知っているなら、私はまだベストプラクティスを知りたいです!

于 2015-09-11T02:26:24.800 に答える