#iterator #join #sql

bin+lib joinkit

高效的 SQL 样式连接的迭代器适配器

2 个不稳定版本

使用旧的 Rust 2015

0.2.0 2016年5月3日
0.1.0 2015年12月2日

#45 in #join

MIT 许可证

86KB
1.5K SLoC

Joinkit

高效的 SQL 样式连接的迭代器适配器。该库的文档在这里

使用方法,将以下代码添加到您的 Cargo.toml 中

[dependencies]
joinkit = "*"

然后在您的 crate 中包含以下代码

extern crate joinkit;

use joinkit::Joinkit;

二进制文件

此 crate 提供了两个二进制文件:hjoinmjoin,分别用于通过 Hash JoinMerge Join 策略在命令行中连接数据。

有关连接策略的更多信息,请参阅文档。您也可以运行 hjoin --helpmjoin --help 了解它们的用法。

示例

准备测试数据

data_path=/tmp/join
if ! [[ -d $data_path ]]; then mkdir -p $data_path; fi
cd $data_path
gawk 'BEGIN{n=20;for(i=0;i<n;i++){print i ",L"}}' > left-num-20
gawk 'BEGIN{n=20;for(i=(n/2);i<(n+n/2);i++){print i ",R"}}' > right-num-20

gawk 'BEGIN{n=20;for(i=0;i<n;i++){print i ",L"}}' | sort -t , -k 1,1 > left-char-20
gawk 'BEGIN{n=20;for(i=(n/2);i<(n+n/2);i++){print i ",R"}}' | sort -t , -k 1,1 > right-char-20

gawk 'BEGIN{n=1000000;for(i=0;i<n;i++){print i ",L"}}' > left-num-1M
gawk 'BEGIN{n=1000000;for(i=(n/2);i<(n+n/2);i++){print i ",R"}}' > right-num-1M

gawk 'BEGIN{n=1000000;for(i=0;i<n;i++){print i ",L"}}' | sort -t , -k 1,1 > left-char-1M
gawk 'BEGIN{n=1000000;for(i=(n/2);i<(n+n/2);i++){print i ",R"}}' | sort -t , -k 1,1 > right-char-1M

克隆仓库

cd ~/some/local/path
git clone https://github.com/milancio42/joinkit.git
cd joinkit
cargo build --release
cd target/release

内连接

输出仅包含两个输入文件都存在的键的行。
左文件的连接键由第二列和第一列组成,而右文件的连接键由第一列和第二列组成(顺序很重要)。

注意,在 hjoin 的情况下,右输入数据被加载到 HashMap 中。

./hjoin -1 1 -2 1 $data_path/left-char-20 $data_path/right-char-20

# in order to join on numeric data, use '-u' flag to convert a string to 'u64' (or '-i' to 'i64')
./hjoin -1 1-u -2 1-u $data_path/left-num-20 $data_path/right-num-20

这相当于

./hjoin -1 1 -2 1 -m inner -R $'\n' -F ',' $data_path/left-char-20 $data_path/right-char-20

./hjoin -1 1 -2 1 --mode inner --in-rec-sep $'\n' --in-field_sep ',' --out-rec-sep $'\n' --out-field-sep ',' $data_path/left-char-20 $data_path/right-char-20

./hjoin -1 1 -2 1 --mode inner --in-rec-sep-left $'\n' --in-rec-sep-right $'\n' --in-field_sep-left ',' --in-field_sep-right ',' --out-rec-sep $'\n' --out-field-sep ',' $data_path/left-char-20 $data_path/right-char-20

由于两个输入文件都根据连接键排序,我们可以使用 mjoin 获取相同的结果

./mjoin -1 1 -2 1 $data_path/left-char-20 $data_path/right-char-20

左外连接

输出仅包含在左输入文件中独有的键的行。

./hjoin -1 1 -2 1 -m left-excl $data_path/left-char-20 $data_path/right-char-20

./mjoin -1 1 -2 1 -m left-excl $data_path/left-char-20 $data_path/right-char-20

左外连接

输出包含 内连接左外连接 的并集。

./hjoin -1 1 -2 1 -m left-outer $data_path/left-char-20 $data_path/right-char-20

./mjoin -1 1 -2 1 -m left-outer $data_path/left-char-20 $data_path/right-char-20

右外连接

输出仅包含在右输入文件中独有的键的行。注意,在 hjoin 的情况下,输出根据 HashMap 的内部排序进行排序,这很可能与输入不同。

./hjoin -1 1 -2 1 -m right-excl $data_path/left-char-20 $data_path/right-char-20

./mjoin -1 1 -2 1 -m right-excl $data_path/left-char-20 $data_path/right-char-20

右外连接

输出包含 内连接右外连接 的并集。注意,在 hjoin 的情况下,输出根据 HashMap 的内部排序进行排序,这很可能与输入不同。

./hjoin -1 1 -2 1 -m right-outer $data_path/left-char-20 $data_path/right-char-20

./mjoin -1 1 -2 1 -m right-outer $data_path/left-char-20 $data_path/right-char-20

全外连接

输出包含 左外连接内连接右外连接 的并集。注意,在 hjoin 的情况下,输出根据 HashMap 的内部排序进行排序,这很可能与输入不同。

./hjoin -1 1 -2 1 -m full-outer $data_path/left-char-20 $data_path/right-char-20

./mjoin -1 1 -2 1 -m full-outer $data_path/left-char-20 $data_path/right-char-20

性能

待定

许可

Joinkit遵循MIT许可协议。

依赖项

~1MB
~15K SLoC