bigquery-etl/udf_js/json_extract_histogram.sql

57 строки
1.5 KiB
SQL

/*
Returns a parsed struct from a JSON string representing a histogram.
This implementation uses JavaScript and is provided for performance comparison;
see udf/udf_json_extract_histogram for a pure SQL implementation that will likely
be more usable in practice.
*/
CREATE OR REPLACE FUNCTION
udf_js.json_extract_histogram (input STRING)
RETURNS STRUCT<bucket_count INT64,
histogram_type INT64,
`sum` INT64,
`range` ARRAY<INT64>,
`values` ARRAY<STRUCT<key INT64,
value INT64>> >
LANGUAGE js AS """
if (input == null) {
return null;
}
var result = JSON.parse(input);
var valuesMap = result.values;
var valuesArray = [];
for (var key in valuesMap) {
valuesArray.push({"key": parseInt(key), "value": valuesMap[key]})
}
result.values = valuesArray;
return result;
""";
-- Tests
WITH
histogram AS (
SELECT AS VALUE
'{"bucket_count":10,"histogram_type":1,"sum":2628,"range":[1,100],"values":{"0":12434,"1":297,"13":8}}' ),
--
extracted AS (
SELECT
udf_js.json_extract_histogram(histogram).*
FROM
histogram )
--
SELECT
assert_equals(10, bucket_count),
assert_equals(1, histogram_type),
assert_equals(2628, `sum`),
assert_array_equals([1, 100], `range`),
assert_array_equals([STRUCT(0 AS key, 12434 AS value),
STRUCT(1 AS key, 297 AS value),
STRUCT(13 AS key, 8 AS value)],
`values`)
FROM
extracted