2 个不稳定版本
使用旧的 Rust 2015
0.2.0 | 2016年5月3日 |
---|---|
0.1.0 | 2015年12月2日 |
#45 in #join
86KB
1.5K SLoC
Joinkit
高效的 SQL 样式连接的迭代器适配器。该库的文档在这里。
使用方法,将以下代码添加到您的 Cargo.toml 中
[dependencies]
joinkit = "*"
然后在您的 crate 中包含以下代码
extern crate joinkit;
use joinkit::Joinkit;
二进制文件
此 crate 提供了两个二进制文件:hjoin
和 mjoin
,分别用于通过 Hash Join
和 Merge Join
策略在命令行中连接数据。
有关连接策略的更多信息,请参阅文档。您也可以运行 hjoin --help
或 mjoin --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