Skip to content
司马顿的博客
司马顿的博客

司马顿的博客

Drill查询复杂的数据结构

Posted on 2022年4月3日2022年4月4日 By 司马顿

我发现Drill查询复杂的数据结构(map, array)等,还是挺麻烦的,要做多个临时表的join。

比如这个Json:

{     
     "first_name":
     {
       "0":"Robert",
       "1":"Steve",
       "2":"Anne",
       "3":"Alice"
     },
      "last_name":
      {
        "0":"Hernandez",
        "1":"Smith",
        "2":"Raps",
        "3":"Muller"
     },
      "birthday":
      {
        "0":"5/3/67",
        "1":"8/4/84",
        "2":"9/13/91",
        "3":"4/15/75"
      } 
}

要按照合理的表格布局来查询,得写如下一大堆SQL:

> select firstName,lastName,birthday from
> (
>   select row_number() over(order by '1') as rowID,
>   flatten(kvgen(first_name))['value'] as firstName
>   from `columns.json`
> ) as t1 join 
> (
>   select row_number() over(order by '1') as rowID,
>   flatten(kvgen(last_name))['value'] as lastName
>   from `columns.json`
> ) as t2 on t1.rowID = t2.rowID
> join
> ( 
>   select row_number() over(order by '1') as rowID,
>   flatten(kvgen(birthday))['value'] as birthday
>   from `columns.json`
> ) as t3 on t1.rowID = t3.rowID;

+-----------+-----------+----------+
| firstName | lastName  | birthday |
+-----------+-----------+----------+
| Robert    | Hernandez | 5/3/67   |
| Steve     | Smith     | 8/4/84   |
| Anne      | Raps      | 9/13/91  |
| Alice     | Muller    | 4/15/75  |
+-----------+-----------+----------+
4 rows selected (0.368 seconds)

主要在于drill读取Json默认还是压缩到一起的,要调用kvgen和flatten之类的函数,把它们由一行多列的格式,打散成多行一列的格式。

比如默认的select是这种格式:

> select first_name from `columns.json`;
+---------------------------------------------------+
|                    first_name                     |
+---------------------------------------------------+
| {"0":"Robert","1":"Steve","2":"Anne","3":"Alice"} |
+---------------------------------------------------+
1 row selected (0.141 seconds)

调用kvgen(产生map)和flatten(打散)函数后,才能得到这种格式:

> select flatten(kvgen(first_name)) from `columns.json`;
+------------------------------+
|            EXPR$0            |
+------------------------------+
| {"key":"0","value":"Robert"} |
| {"key":"1","value":"Steve"}  |
| {"key":"2","value":"Anne"}   |
| {"key":"3","value":"Alice"}  |
+------------------------------+
4 rows selected (0.14 seconds)

当然可以单独3个select得到各个列的数据:

> select row_number() over (order by '1') as rowID, flatten(kvgen(first_name))['value'] as firstName from `columns.json`;
+-------+-----------+
| rowID | firstName |
+-------+-----------+
| 1     | Robert    |
| 2     | Steve     |
| 3     | Anne      |
| 4     | Alice     |
+-------+-----------+
4 rows selected (0.176 seconds)

> select row_number() over (order by '1') as rowID, flatten(kvgen(last_name))['value'] as lastName from `columns.json`;
+-------+-----------+
| rowID | lastName  |
+-------+-----------+
| 1     | Hernandez |
| 2     | Smith     |
| 3     | Raps      |
| 4     | Muller    |
+-------+-----------+
4 rows selected (0.155 seconds)

> select row_number() over (order by '1') as rowID, flatten(kvgen(birthday))['value'] as birthday from `columns.json`;
+-------+----------+
| rowID | birthday |
+-------+----------+
| 1     | 5/3/67   |
| 2     | 8/4/84   |
| 3     | 9/13/91  |
| 4     | 4/15/75  |
+-------+----------+
4 rows selected (0.124 seconds)

但要把它们join到一起,就要按照第一个SQL代码去执行了。这样的SQL写起来很长,也比较费力。不过相比起来,drill能把Json按照SQL语句去解析,已经很强大了。这样对无处不在的Json数据的查询,就有了趁手的工具。

Print this entry

博客 Apache Drill技术

文章导航

Previous post
Next post

Archives

  • 2022 年 9 月 (2)
  • 2022 年 8 月 (2)
  • 2022 年 7 月 (2)
  • 2022 年 6 月 (1)
  • 2022 年 5 月 (4)
  • 2022 年 4 月 (18)
  • 2022 年 3 月 (13)
  • 2022 年 2 月 (6)
  • 2022 年 1 月 (8)
  • 2021 年 12 月 (14)
  • 2021 年 11 月 (7)
  • 2021 年 10 月 (19)
  • 2021 年 9 月 (25)
  • 2021 年 8 月 (45)
  • 2021 年 7 月 (33)
  • 2021 年 6 月 (10)
  • 2021 年 3 月 (2)
  • 2021 年 2 月 (8)
  • 2021 年 1 月 (8)
  • 2020 年 12 月 (20)
  • 2020 年 11 月 (11)
  • 2020 年 10 月 (14)
  • 2020 年 9 月 (33)
  • 2020 年 8 月 (17)
  • 2020 年 7 月 (21)
  • 2020 年 6 月 (20)
  • 2020 年 5 月 (10)
  • 2020 年 4 月 (17)
  • 2020 年 3 月 (18)
  • 2020 年 2 月 (11)
  • 2020 年 1 月 (7)
  • 2019 年 12 月 (13)
  • 2019 年 11 月 (14)
  • 2019 年 10 月 (8)
  • 2019 年 9 月 (9)
  • 2019 年 8 月 (13)
  • 2019 年 7 月 (12)
  • 2019 年 6 月 (20)
  • 2019 年 5 月 (18)
  • 2019 年 4 月 (18)
  • 2019 年 3 月 (11)
  • 2019 年 2 月 (12)
  • 2019 年 1 月 (15)
  • 2018 年 12 月 (15)
  • 2018 年 11 月 (13)
  • 2018 年 10 月 (13)
  • 2018 年 9 月 (21)
  • 2018 年 8 月 (29)
  • 2018 年 7 月 (23)
  • 2018 年 6 月 (21)
  • 2018 年 5 月 (5)

标签

AI (24) Apache Drill (11) 加拿大 (21) 宇宙与人生 (19) 情感 (281) 技术 (75) 抑郁症 (68) 新冠病毒 (13) 汽车 (30) 生活 (333) 职场 (25) 行业观点 (60) 读书文艺 (48)
©2025 司马顿的博客 | WordPress Theme by SuperbThemes