BigQuery UDF для расширения json для записи - PullRequest
0 голосов
/ 05 марта 2020

У меня есть (JSON) строковый столбец, подобный этому:

[{"someValue":6,"other":true, "maybeThisValue":"exists?"},{"someValue": "cool value", "other": null}]

Я бы хотел закончить с этим:

+------------+-------+----------------+
| someValue  | other | maybeThisValue |
+------------+-------+----------------+
| 6          | true  | exists?        |
+------------+-------+----------------+
| cool value |       |                |
+------------+-------+----------------+

, потому что схема сильно меняется Я хотел бы получить ключи строки и динамически генерировать запись из нее (без массивов или структур). Входные данные JSON всегда будут массивом объектов с одним значением ключа глубины (без дочерних узлов).

Я думаю, возможно, это невозможно с одним UDF, потому что мы должны указать возвращаемое значение заранее и могут быть дополнительные столбцы. Но может быть, это возможно с двумя UDF? Может ли один UDF сгенерировать и сохранить, а затем выполнить другой UDF?

Или, может быть, я могу начать с UDF, который даст мне уникальные ключи (JSON) строк, а затем написать макрос dbt, который будет использовать возврат этого вызова функции ?? (Я не уверен, что это возможно)

Я знаю, как это сделать в postgres, но мне интересно, есть ли у вас какие-либо идеи, чтобы заставить его работать в BigQuery или если это может быть сделано в UDF, что было бы действительно здорово, даже если это было бы немного медленно

Преобразование типов данных является трудной задачей, но если бы оно могло обнаружить первые 5 столбцов, то все числа и от safe_cast до int это было бы действительно очень круто ... я не уверен, как это сделать, хотя строка так хорошо

похоже на это:

https://dba.stackexchange.com/questions/151838/postgresql-json-column-to-view

https://github.com/fishtown-analytics/dbt-utils/blob/master/macros/sql/get_column_values.sql

возможно, это возможно с пользовательским JSONPath '*.*': Какие выражения JsonPath поддерживаются в BigQuery?

возможно, это невозможно без array<struct>: /

может быть, это возможно с помощью скриптов BigQuery ?? https://cloud.google.com/bigquery/docs/reference/standard-sql/scripting

возможно, я смогу использовать это как часть этого Как извлечь все ключи в JSON объекте с помощью BigQuery

Я могу получить значения, как это ...

CREATE TEMP FUNCTION json2array(json STRING)
RETURNS ARRAY<STRING>
LANGUAGE js AS """
  return JSON.parse(json).map(x=>JSON.stringify(x));
"""; 

CREATE TEMPORARY FUNCTION CUSTOM_JSON_EXTRACT(json STRING, json_path STRING)
RETURNS ARRAY<STRING>
LANGUAGE js AS """
        return jsonPath(JSON.parse(json), json_path);
"""
OPTIONS (
    library="gs://your_bucket/jsonpath-0.8.0.js"
);

select SPLIT(CUSTOM_JSON_EXTRACT(jsoncolumn,'*.'))
FROM `db.master`,
unnest(json2arrayUDF(JSON_EXTRACT(jsoncolumn, "$"))) jsoncolumn

это выглядит так:

|1 | 6 |
|  | true |
|  | exists? |
|2 | cool value |
|  |  |
|  |  |

Теперь мне просто нужно получить ключи и затем как-то сопоставить две вещи .. .

...