У меня есть (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 |
| | |
| | |
Теперь мне просто нужно получить ключи и затем как-то сопоставить две вещи .. .