CREATE TEMP FUNCTION jsonObjectKeys(input STRING)
RETURNS Array<String>
LANGUAGE js AS """
return Object.keys(JSON.parse(input));
""";
WITH keys AS (
SELECT
jsonObjectKeys(myColumn) AS keys
FROM
myProject.myTable
WHERE myColumn IS NOT NULL
)
SELECT
DISTINCT k
FROM keys
CROSS JOIN UNNEST(keys.keys) AS k
ORDER BY k
6条答案
按热度按时间zaqlnxep1#
下面是使用Standard SQL的代码:
g6baxovj2#
以下版本修复了原始答案中的一些“问题”,如:
1.仅发出第一级密钥
2.必须手动编译然后运行最终查询以基于发现的密钥提取信息
结果如下
a1o7rhls3#
上面的答案在当前(2021)版本中不起作用,如果JSON字段为空或JSON具有空条目,则失败,聚合不好(我们试图获得结构,而不是内容),等等。
所以,这里有一个基于Felipe Hoffa的answer的改进版本。
它是完全递归的检查
null
和Array
类型;抑制数组索引(如[]
);标记为确定性的,这样它就会被缓存;并对结果进行分组、排序和计数。样本输出:
注意事项:
1.空字符串键意味着字段本身实际上为空
deprecated_fields
键是JSON中所有示例都是..., deprecated_fields: [], ...
的键null
作为字符串"null"
返回,与其他类型一样(非SQL null)它可以被改进以检测不同类型的数字(int、bigint、float、decimal)、日期、存储为字符串的数字等。但是,嗯,这对我的目的来说已经足够好了,这需要更多的处理。
只需更改最后几行中的
your-*
位:mrzz3bfm4#
如何在BigQuery中使用JavaScript UDF提取所有JSON对象键:
分组和计数:
找到所有可以使用的键后,就可以在普通的SQL查询中使用JSON_EXTRACT_SCALAR:
现在你知道了键,你可以提取一个类型的所有已知信息:
(样本数据取自Open Library数据转储https://openlibrary.org/developers/dumps,基于reddit conversation)
14ifxucb5#
这就是我提出的(特别是针对StandardSQL)。不确定是否在列表中累积是最好的方法...另外..我简化了我的情况下,我只是关心的钥匙。
o2rvlv0m6#
在BigQuery中,可以使用
JSON_EXTRACT_ARRAY_KEYS
函数提取JSON
对象中的所有键。此函数返回JSON对象中存在的键的数组。以下是如何在BigQuery中从JSON对象中提取所有键的示例:
将your_json_column替换为包含JSON对象的列名,将your_table替换为存储JSON对象的表的名称。
JSON_EXTRACT_ARRAY_KEYS
函数接受JSON对象作为输入,并返回一个键数组。每个键都将是结果数组中的一个元素。如果你想在一个表中的多个JSON对象中获取不同的键,你可以将
UNNEST
函数与JSON_EXTRACT_ARRAY_KEYS
结合使用:该查询将返回表中JSON对象中存在的所有不同键。
请记住,将your_json_column替换为包含JSON对象的实际列名,将your_table替换为存储JSON对象的表名。
通过使用
JSON_EXTRACT_ARRAY_KEYS
函数和可能的UNNEST
,您可以轻松地从BigQuery中的JSON对象中提取所有键,并根据需要执行进一步的分析或处理。