Google bigquery 用于将json扩展为记录的BigQuery UDF

Google bigquery 用于将json扩展为记录的BigQuery UDF,google-bigquery,user-defined-functions,Google Bigquery,User Defined Functions,我有一个(JSON)字符串列,如下所示: [{"someValue":6,"other":true, "maybeThisValue":"exists?"},{"someValue": "cool value", "other": null}] 最后,我想说: +------------+-------+----------------+ | someValue | other | maybeThisValue | +------------+-------+----------------

我有一个(JSON)字符串列,如下所示:

[{"someValue":6,"other":true, "maybeThisValue":"exists?"},{"someValue": "cool value", "other": null}]
最后,我想说:

+------------+-------+----------------+
| someValue  | other | maybeThisValue |
+------------+-------+----------------+
| 6          | true  | exists?        |
+------------+-------+----------------+
| cool value |       |                |
+------------+-------+----------------+
由于模式变化太大,我希望获取字符串的键并从中动态生成记录(无数组或结构)。输入JSON将始终是具有单个深度键值(无子节点)的对象数组

我在想,对于一个UDF,这可能是不可能的,因为我们必须提前指定返回值,并且可能会有额外的列。但也许这是可能的两个UDF?一个自定义项能否生成并保存,然后执行另一个自定义项

或者我可以从一个UDF开始,它将给我(JSON)字符串的唯一键,然后编写一个dbt宏,它将使用该函数调用的返回??(我不确定这是否可行)

我知道如何在中实现这一点,但我想知道您是否有任何想法让它在BigQuery中工作,或者是否可以在UDF中实现,即使它有点慢,也会非常酷

转换数据类型是一件痛苦的事情,但是如果它能够检测到前5列都是数字,并且安全地转换为int,那将非常酷。。。我不知道该怎么做,所以字符串是好的

与此类似:

也许可以使用自定义JSONPath
“****”

如果没有
数组
,这可能是不可能的:/

也许这可以通过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

现在我只需要拿到钥匙,然后以某种方式将这两件事匹配起来……

这是一个很好的要求,但是现在在SQL中工作时,您需要已经定义了结果行的结构。我决定创建一个脚本,通过查找目标表的jsonstring列并使用Object.keys()@jaksco执行UDF来生成所需的SQL查询。您介意共享您的脚本吗?我遇到了完全相同的问题。谢谢。我再也不能访问这个脚本了,但是你可以做类似的事情。实际上,我不建议在BigQuery中解析字符串。这对于大数据来说太慢了。使用BQ在导入时自动创建的结构和数组将引导您找到性能最好的解决方案。你只需要把它们打开
|1 | 6 |
|  | true |
|  | exists? |
|2 | cool value |
|  |  |
|  |  |