将复杂字符串字段中的多个值转换为可数结构

Posted

技术标签:

【中文标题】将复杂字符串字段中的多个值转换为可数结构【英文标题】:Transformation of multiple values in complex string field to a countable structure 【发布时间】:2019-11-25 14:03:36 【问题描述】:

例如对于一个字段中的数据:

"""noAbsolutValues"":""HIGHLIGHTS"":[""engineData_startStopSystem"",""search_parkingAssistants"",""heatingCooling_climatisation"",""multimedia_navigationSystem"",""search_seatHeating"",""wheel_multifunctionalWheel""],""CLIMATISATION"":[""selector_climatisation_airCondition""],""MULTIMEDIA"":[""multimedia_navigationSystem"",""multimedia_usbInterface"",""multimedia_radioTuner""],""HEATER"":[""selector_coDriverSeats_electricHeated"",""selector_driverSeats_electricHeated""],""ASSISTANTS"":[""assistants_parkingSensors"",""assistants_cruiseControl""],""dateValues"":"

起初我用以下查询分隔我需要的值:

SELECT
ARRAY_TO_STRING(REGEXP_EXTRACT_ALL(filter_query,r'"[[:alpha:]]+_[[:alpha:]]+_[[:alpha:]]+"|"[[:alpha:]]+_[[:alpha:]]+"'),";") as fq
FROM `table`

我的结果是不同类型的行,其值用分号分隔。

例如一行:

"engineData_startStopSystem";"search_parkingAssistants";"heatingCooling_climatisation";"multimedia_navigationSystem";"search_seatHeating";"wheel_multifunctionalWheel";"selector_climatisation_airCondition";"multimedia_navigationSystem";"multimedia_usbInterface";"multimedia_radioTuner";"selector_coDriverSeats_electricHeated";"selector_driverSeats_electricHeated";"assistants_parkingSensors";"assistants_cruiseControl"

现在我必须计算所有变体,完美的是我将一行用于值,一行用于计数结果。

非常感谢大家的帮助

【问题讨论】:

您的HIGHLIGHTSCLIMATISATIONMULTIMEDIAHEATERASSISTANTS 分组是否始终存在?会有意想不到的/新的分组吗?一个固定的集合将使这个查询更容易。 不,此查询不需要此分组。我猜这个结构取决于它所属的过滤器导航。 【参考方案1】:

我相信这个帖子中提供的例子会对你有所帮助。Key, Value Count in BigQuery

测试数据:

"fil":"property":"id":id_1:"a",id_2:"b",id_3:"c",id_4:"d"

查询:

WITH MyTable AS (
  SELECT STRUCT(STRUCT(ARRAY<STRUCT<key STRING, value STRING>>[('id_1', 'a'), ('id_2', 'b'), ('id_3', 'c'), ('id_4', 'd')] AS id) AS property) AS fil
  UNION ALL SELECT STRUCT(STRUCT(ARRAY<STRUCT<key STRING, value STRING>>[('id_1', 'b'), ('id_3', 'e')] AS id) AS property) AS fil
  UNION ALL SELECT STRUCT(STRUCT(ARRAY<STRUCT<key STRING, value STRING>>[] AS id) AS property) AS fil
  UNION ALL SELECT STRUCT(STRUCT(ARRAY<STRUCT<key STRING, value STRING>>[('id_4', 'a'), ('id_2', 'c')] AS id) AS property) AS fil)
SELECT
  COUNT(DISTINCT id.key) AS num_keys,
  COUNT(DISTINCT id.value) AS num_values
FROM MyTable t, t.fil.property.id AS id;

输出:

+----------+------------+
| num_keys | num_values |
+----------+------------+
|        4 |          5 |
+----------+------------+

【讨论】:

看起来可能合适,但我不明白背后的逻辑。看来我的水平太低了。我不明白如何将我的数据中的数组结构嵌入到这个 SELECT STRUCT 构造中。 正如您在我们的documentation 中看到的那样, WITH 子句包含一个或多个命名子查询,每次后续的 SELECT 语句引用它们时都会执行这些子查询。任何子句或子查询都可以引用您在 WITH 子句中定义的子查询。这包括集合运算符两侧的任何 SELECT 语句,例如 UNION。有关arrays 和struct 的更多信息 如果它确实符合您的需求并且您现在了解其背后的逻辑,请接受答案,以便对社区有所帮助。

以上是关于将复杂字符串字段中的多个值转换为可数结构的主要内容,如果未能解决你的问题,请参考以下文章

将 MongoDB 字段从字符串转换为数组中的 ISODate

将字符串转换为表中的字段值

请问各位java中如何将数据库返回的多个字段值拼接为一个list并转换为json对象返回到前台,谢谢!

AWS Glue 将字符串值从 postgres 转换为 json 数组

如何将字符串中的多个数字转换为整数

按其值将任何结构字段名称转换为字符串