我们有一个非常大的数据集。我需要获取从源属性映射到 json 中规范化属性的所有值。标准化和源之间的关系是,如果标准化值中的source_key与source_attributes键相同,那么我们应该返回它们所有的名称。
我的输入有点像这样:
"source_attributes": {
"desirability": {
"values": [
{
"value": "000000002"
}
]
},
"isbn-13": {
"values": [
{
"value": "9781934568392"
}
]
}
},
"normalized": {
"isbn-13": [
{
"properties": {
"attributeId": "85984",
"multiselect": "N",
"domain": "pcs",
"display_attribute_name": "ISBN-13",
"taxonomy_version": "urn:taxonomy:pcs2.0",
"attributeName": "ISBN-13"
},
"values": [
{
"display_attr_name": "ISBN-13",
"locale": "en_US",
"value": "9781934568392",
"isPrimary": "true",
"source_value": "9781934568392",
"source_key": "isbn-13"
}
]
}
]
}
}
我想要的输出是这样的:
我编写的查询从具有源属性并标准化的数据中获取所有值,但是由于两个元素在结构上不同,我如何比较这些值?
SELECT json_extract(element_json, '$.source_attributes') as source_att, json_extract(element_json, '$.normalized') as normal
FROM `data`
where json_value(element_json,'$.source')='TEST'
limit 1000;
以下是一个 SQL 片段,说明了一种可能的技术:
CREATE TEMP FUNCTION keys(val JSON)
RETURNS ARRAY<STRING>
LANGUAGE js AS r"""
return Object.keys(val)
""";
WITH data AS (
SELECT JSON '{"source": {"a": 1,"b": 2,"c": 3},"target": {"a": 2,"d": 4}}' as json_data
),
source_keys as (
SELECT keys(json_data.source) AS s_keys FROM data
),
target_keys as (
SELECT keys(json_data.target) as t_keys FROM data
)
SELECT s_key_t, CASE WHEN s_key_t IN UNNEST((SELECT t_keys from target_keys)) THEN s_key_t ELSE null END as t_key_t from UNNEST((SELECT s_keys from source_keys)) as s_key_t
在这个故事中,我们假设一个 JSON 对象本身包含两个子对象,称为
source
和 target
。 我们的目标是找出源中的哪些字段也存在于目标中,我们关心它们的名称/身份而不是它们的值。
我们使用 UDF 从源和目标返回一个字段名称数组,然后通过(逻辑上)询问源字段名称数组中的每个键来比较它们,目标字段名称中是否存在相同的名称数组。