Apache Druid 数组展开(Unnest)操作实战指南

Apache Druid 数组展开(Unnest)操作实战指南

druid Druid是一个高速的数据查询引擎,主要用于OLAP场景。它的特点是快速查询、支持复杂查询语句、易于部署等。适用于数据分析和报告生成场景。 druid 项目地址: https://gitcode.com/gh_mirrors/dru/druid

概述

在数据分析领域,处理嵌套数据结构是常见的需求。Apache Druid 作为一款高性能的实时分析数据库,提供了强大的数组展开(Unnest)功能,能够将嵌套的数组数据展开为多行记录。本文将详细介绍如何在Druid中使用Unnest操作处理数组类型数据。

数组展开的基本概念

数组展开(Unnest)是指将包含数组的列拆分为多行,每行包含数组中的一个元素。例如,对于包含值["a","b"]的列,展开后会生成两行,分别包含值"a""b"

使用注意事项

  1. 数据量膨胀:展开操作会显著增加行数,需谨慎使用
  2. 嵌套限制:Druid不支持数组嵌套数组的展开
  3. 性能影响:复杂展开操作可能影响查询性能

实战准备

数据准备

我们使用以下示例数据,其中包含多个数组类型的列:

{
  "t":"2000-01-01",
  "m1":1.0,
  "m2":1.0,
  "dim1":"",
  "dim2":["a"],
  "dim3":["a","b"],
  "dim4":["x","y"],
  "dim5":["a","b"]
}

数据加载

可以通过SQL或原生JSON两种方式加载数据:

SQL方式
REPLACE INTO nested_data OVERWRITE ALL
SELECT
  TIME_PARSE("t") as __time,
  dim1, dim2, dim3, dim4, dim5,
  m1, m2
FROM TABLE(
    EXTERN(
    '{"type":"inline","data":"..."}',
    '{"type":"json"}',
    '[{"name":"t","type":"string"},...]'
  )
)
PARTITIONED BY YEAR
JSON方式
{
  "type": "index_parallel",
  "spec": {
    "ioConfig": {
      "type": "index_parallel",
      "inputSource": {
        "type": "inline",
        "data":"..."
      },
      "inputFormat": {
        "type": "json"
      }
    },
    "dataSchema": {
      "dataSource": "nested_data",
      "granularitySpec": {
        "segmentGranularity": "YEAR"
      },
      "timestampSpec": {
        "column": "t",
        "format": "auto"
      },
      "dimensionsSpec": {
        "dimensions": [
          "dim1", "dim2", "dim3", "dim4", "dim5"
        ]
      },
      "metricsSpec": [
        {
          "name": "m1",
          "type": "floatSum",
          "fieldName": "m1"
        }
      ]
    }
  }
}

SQL方式展开数组

基本语法

SELECT column_alias_name 
FROM datasource 
CROSS JOIN UNNEST(source_expression) AS table_alias_name(column_alias_name)

单列展开

SELECT d3 
FROM "nested_data" 
CROSS JOIN UNNEST(MV_TO_ARRAY(dim3)) AS example_table(d3)

注意:对于多值字符串维度,需要使用MV_TO_ARRAY函数转换。

虚拟列展开

SELECT dim4, dim5, d45 
FROM nested_data 
CROSS JOIN UNNEST(ARRAY[dim4,dim5]) AS example_table(d45)

或者使用数组连接:

SELECT dim4, dim5, d45 
FROM nested_data 
CROSS JOIN UNNEST(ARRAY_CONCAT(dim4,dim5)) AS example_table(d45)

多列展开

SELECT dim3, dim4, dim5, d3, d45 
FROM "nested_data" 
CROSS JOIN UNNEST(MV_TO_ARRAY("dim3")) AS foo1(d3) 
CROSS JOIN UNNEST(ARRAY[dim4,dim5]) AS foo2(d45)

带过滤的展开

SELECT d3 
FROM (SELECT * FROM nested_data WHERE dim2 IN ('abc')) 
CROSS JOIN UNNEST(MV_TO_ARRAY(dim3)) AS example_table(d3)

分组统计

SELECT d3, COUNT(*) 
FROM nested_data 
CROSS JOIN UNNEST(MV_TO_ARRAY(dim3)) AS example_table(d3) 
GROUP BY d3
ORDER BY d3 DESC

原生查询方式展开数组

Scan查询

{
  "queryType": "scan",
  "dataSource": {
    "type": "unnest",
    "base": {
      "type": "table",
      "name": "nested_data"
    },
    "virtualColumn": {
      "type": "expression",
      "name": "unnest-dim3",
      "expression": "\"dim3\""
    }
  },
  "columns": ["__time", "dim1", "dim2", "dim3", "m1", "m2", "unnest-dim3"]
}

GroupBy查询

{
  "queryType": "groupBy",
  "dataSource": {
    "type": "unnest",
    "base": "nested_data",
    "virtualColumn": {
      "type": "expression",
      "name": "unnest-dim3",
      "expression": "\"dim3\""
    }
  },
  "dimensions": ["unnest-dim3"],
  "limitSpec": {
    "type": "default",
    "columns": [{
      "dimension": "unnest-dim3",
      "direction": "descending"
    }]
  }
}

TopN查询

{
  "queryType": "topN",
  "dataSource": {
    "type": "unnest",
    "base": {
      "type": "table",
      "name": "nested_data"
    },
    "virtualColumn": {
      "type": "expression",
      "name": "unnest-dim3",
      "expression": "\"dim3\""
    }
  },
  "dimension": {
    "type": "default",
    "dimension": "unnest-dim3",
    "outputName": "topN-unnest-d3",
    "outputType": "STRING"
  },
  "metric": {
    "type": "inverted",
    "metric": {
      "type": "numeric",
      "metric": "a0"
    }
  },
  "aggregations": [
    {
      "type": "floatMin",
      "name": "a0",
      "fieldName": "m1"
    }
  ]
}

虚拟列展开

{
  "queryType": "scan",
  "dataSource":{
    "type": "unnest",
    "base": {
      "type": "table",
      "name": "nested_data"
    },
    "virtualColumn": {
      "type": "expression",
      "name": "dim45",
      "expression": "array_concat(\"dim4\",\"dim5\")",
      "outputType": "ARRAY<STRING>"
    }
  },
  "columns": ["dim45", "m1"]
}

最佳实践

  1. 性能优化:只展开必要的列,避免不必要的数据膨胀
  2. 过滤优先:在展开前先过滤数据,减少处理的数据量
  3. 合理使用:评估是否真的需要展开操作,有时其他查询方式可能更高效
  4. 监控资源:展开操作可能消耗大量资源,需监控集群状态

通过本文的介绍,您应该已经掌握了在Apache Druid中使用Unnest操作处理数组数据的方法。无论是通过SQL还是原生查询,都能灵活应对各种数组展开场景。

druid Druid是一个高速的数据查询引擎,主要用于OLAP场景。它的特点是快速查询、支持复杂查询语句、易于部署等。适用于数据分析和报告生成场景。 druid 项目地址: https://gitcode.com/gh_mirrors/dru/druid

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

资源下载链接为: https://pan.quark.cn/s/00cceecb854d ZenCart是一款开源的电商系统,非常适合外贸B2C业务。标题“zencart外贸系统b2c,多国语商城,已搭建,测试好,拿去吧”表明这是一套配置好且测试完成的ZenCart系统,可用于构建多语言外贸购物平台。 描述中提到“zencart英文外贸网站,安装测试成功,内有安装成功图片”,说明该压缩包包含已安装好的ZenCart系统,以英文为主界面语言,适合外贸。系统经过全面测试,附有安装成功截图,方便新手直观了解正确安装界面,降低使用难度。 “1.zencart外贸商城,多国语言”强调ZenCart支持多语言,这对面向全球消费者的外贸商城很重要。多语言界面能帮助不同国家客户更好地使用网站,提升体验和销售。ZenCart内置语言管理功能,方便添加和切换语言。 “2.b2c已搭建成功,通过测试”表明该系统针对B2C模式进行了定制。B2C电商需要用户注册、商品展示、购物车、订单处理、支付接口等功能。已搭建好的系统意味着这些功能都已就绪,只需添加商品和进行基本配置即可运营。压缩包内通常包含ZenCart核心文件、主题模板、语言包、数据库配置文件、安装说明等重要文件。核心文件包含运行所需的PHP脚本和资源;主题模板决定网站视觉风格;语言包提供翻译;数据库配置文件用于连接数据库存储信息;安装说明指导用户设置和启动系统。 这个压缩包为外贸B2C商家提供了一套预配置的ZenCart解决方案,包含多语言支持且已搭建测试完成。商家只需根据资料进行个性化设置,如添加商品、设置支付方式、调整配送选项等,就能快速开展在线销售业务,是进入外贸电商领域的理想起点。
资源下载链接为: https://pan.quark.cn/s/6b3e936ec683 在Windows系统中搭建Speedtest环境是网络优化、服务器性能监控和宽带质量测试等领域的常用操作。Speedtest由Ookla公司开发,可精准测量网络的上传速度、下载速度和延迟。它通过向服务器发送数据包并测量传输时间来计算速度,支持HTTP、TCP和UDP等多种协议,以确保测试结果的准确性。 在Windows上搭建Speedtest环境,主要有以下步骤: 安装Python环境:由于Speedtest的命令行版本基于Python编写,因此需要先在Windows上安装Python(推荐3.x版本)。可以从Python官网下载并安装。 下载Speedtest CLI:访问Ookla的GitHub页面(https://github.com/ookla/speedtest-cli)获取最新版本的Speedtest命令行工具。这是一个Python脚本,下载后解压即可在命令行中运行。 配置环境变量:为了在任意目录下运行都能Speedtest,需将Python和Speedtest的路径添加到系统的PATH环境变量中。可以通过控制面板或系统属性进行设置。 运行Speedtest:打开命令提示符,输入speedtest-cli命令。首次运行时,它会自动选择最快的服务器进行测试。如果需要指定特定服务器,可以使用--server参数,例如speedtest-cli --server 1234(1234为服务器ID)。 使用可选参数:Speedtest支持多种可选参数,如--no-latency仅测量速度而不计算延迟,--json将结果输出为JSON格式,便于后续处理。更多参数可参考官方文档。 模拟网络环境:压缩包中可能包含“speedtest模拟环境”,其中可能有用于测试不同网络条件的配置或脚本,例
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贾方能

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值