iT邦幫忙

2024 iThome 鐵人賽

DAY 14
0
AI/ ML & Data

粗暴的資料處理 DuckDB系列 第 14

Day14 -- DuckDB Style SQL (8) ?

  • 分享至 

  • xImage
  •  

在 DuckDB style SQL 中,吸收了很多這十年其他語言與資料函式庫的優點。

其中之一就是 Pandas。

Pandas 天生就支援 concat 把兩個 dataframe 水平 的黏起來

import pandas as pd

df1 = pd.DataFrame({'x': [1, 2, 3]})
df2 = pd.DataFrame({'s': ['a', 'b']}) 
result = pd.concat(
    [df1, df2]
    , axis=1
)

print(result)
x     s
1     a
2     b
3  NaN

但是這件事情在 SQL 非常難辦到,這是一個在 Postgres 要辦到同樣的事情需要的 SQL

CREATE TABLE t1 AS SELECT * FROM (VALUES (1), (2), (3)) AS t(x);
CREATE TABLE t2 AS SELECT * FROM (VALUES ('a'), ('b')) AS t(s);

WITH 
t1_numbered AS (
  SELECT x, ROW_NUMBER() OVER () AS rn
  FROM t1
),
t2_numbered AS (
  SELECT s, ROW_NUMBER() OVER () AS rn
  FROM t2
)
SELECT t1_numbered.x, t2_numbered.s
FROM t1_numbered
FULL OUTER JOIN t2_numbered ON t1_numbered.rn = t2_numbered.rn
ORDER BY t1_numbered.rn;

這是因為 SQL 是 set 的語意,並沒有天生的順序。
但是在讀檔案這個情境下,資料天生是有 row number 的,而且水平的黏起來兩個 table,非常自然。

DuckDB 支援 Position Join,可以想成就是 pd.concat。

CREATE TABLE t1 AS SELECT * FROM (VALUES (1), (2), (3)) AS t(x);
CREATE TABLE t2 AS SELECT * FROM (VALUES ('a'), ('b')) AS t(s);


SELECT *
FROM t1
POSITIONAL JOIN t2;

POSITIONAL JOIN 是一個 SQL 與 Dataframe 融合的好例子
趕快到 DuckDB WASM 或 Colab 試試看吧!


上一篇
Day13 -- DuckDB Style SQL (7) ?
下一篇
Day15 -- DuckDB Style SQL (9) ?
系列文
粗暴的資料處理 DuckDB30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言