google-bigquery - 用于扩展 json 以记录的 BigQuery UDF
问题描述
我有一个像这样的(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,那将真的很酷......我不知道该怎么做,所以 string 很好
与此类似:
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 是可能的'*.*'
:BigQuery 支持哪些 JsonPath 表达式?
也许没有array<struct>
:/
也许这可以通过 BigQuery 脚本实现?https://cloud.google.com/bigquery/docs/reference/standard-sql/scripting
也许我可以将其用作其中的一部分如何使用 BigQuery 提取 JSON 对象中的所有键
我可以得到这样的值......
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 |
| | |
| | |
现在我只需要拿到钥匙,然后以某种方式匹配这两件事......
解决方案
推荐阅读
- javascript - 2D平台射击画布游戏| 创建拍摄功能
- spring-boot - 如何在 Spring Boot 中以编程方式注册 JSF ExceptionHandlerFactory
- c# - WCF 服务 DataServiceConfiguration 命名空间冲突
- python - 使用 lxml 捕获元素值然后删除以创建模板 xml
- ios - 有什么方法可以在 iOS 应用程序中以编程方式访问触控调节状态?
- powershell - 如何通过终端在while循环中终止ssh?
- ios - React Native Bridge Library 用于依赖于其他 iOS 框架的现有 Objective C 框架
- elasticsearch - Elasticsearch java api 索引数据模式
- sql-server - 检查哪一列不可为空
- angular - 角度加载标签而不是 css 文件