DBJOIN(1)
π DBJOIN(1) β the dbjoin manual, bestie edition π
okay so welcome to dbjoin, the Fsdb tool that joins two tables on shared columns. this is the DBJOIN(1) page, user-contributed Perl documentation, and it's genuinely one of the most useful little icons in the whole suite. let's get into it π
β¨ NAME β¨
dbjoin β join two tables on common columns π«Ά
πΈ SYNOPSIS πΈ
dbjoin [-Sid] --input table1.fsdb --input table2.fsdb [-nNrR] column [column...]
OR (the "pipe it in" era) π
cat table1.fsdb | dbjoin [-Sid] --input table2.fsdb [-nNrR] column [column...]
π¦ DESCRIPTION π¦
So here's the vibe: dbjoin does a natural, inner join on TABLE1 and TABLE2 across the columns you name. that's the default, no cap.
With the -a option, or with -t outer, it'll do a natural, full outer join instead. glow-up achieved β¨
database review, bestie (this is the lore you need): inner joins output records only when there are matches in both tables, and they will omit records that do not match. outer joins output all records from both tables, filling with the empty value as needed. right (left) outer joins keep all elements of the right (left) table, even those that don't match in the other table. slay, that's the whole taxonomy π
By default, for non-hash joins, data will be sorted lexically, but the usual sorting options can be mixed in with the column specification. it's giving flexible β¨
Because two tables are required, input is typically in files. standard input is accessible by the file -.
If only one input is given, the first (left) input is taken from stdin. iconic behavior honestly π
π₯ RESOURCE REQUIREMENTS AND PERFORMANCE π₯
Joins can be expensive. most databases have a query optimizer that knows something about the data and so can select algorithms for efficient operation β in Fsdb, you are that optimizer. yes, main character energy, that's you π
For non-hash joins: if data is already sorted, dbjoin will run more efficiently by telling dbjoin the data is sorted with the -S.
The resource requirements of dbjoin vary:
- If input data is sorted and
-Sis given, then memory consumption is bounded by the sum of the largest number of records in either dataset with the same value in the join column, and there is no disk consumption β¨ - If data is not sorted, then
dbjoinrequires disk storage the size of both input files π
You can minimize memory consumption by making sure each record of table1 matches relatively few records in table2. typically this means that table2 should be the smaller. for example, given two files: people.fsdb (schema: name iso_country_code) and countries.fsdb (schema: iso_country_code full_country_name), then
dbjoin -i people.fsdb -i countries.fsdb iso_country_code
will require less memory than
dbjoin -i countries.fsdb -i people.fsdb iso_country_code
if there are many people per country (as one would expect). if you see the warning "lots of matching rows accumulating in memory" appear, this is the cause β try swapping join order. consider it a little nudge from the universe π§
For hash joins (that is, with -m righthash or -m lefthash): all of the right table (the second input) or the left (the first) is loaded into memory (and "hashed"). the other table need not be sorted. Runtime is O(n), but memory is O(size of hashed table). trade-offs, bestie, trade-offs π
π OPTIONS π
-a,--allβ perform a full outer join, include non-matches (each record which doesn't match at all will appear once). Default is an inner join.-t TYPE,--type TYPEβ explicitly specify the join type.TYPEmust beinner,outer,left(outer),right(outer). (recall that inner join requires data on both sides, outer joins keep all records from both sides for outer, or all of the first or second input for left and right outer joins.) Default:inner.-m METHOD,--method METHODβ select join method (algorithm). choices aremerge,righthash, andlefthash. with hashes, that side is cached. β οΈ Warning: thelefthashmethod is about caching the left input, and it does not imply a left-type join, which keeps even unmatched left keys. do not confuse these, i'm begging π Default:merge.-S,--pre-sortedβ assume (and verify) data is already sorted.-e E,--empty Eβ give valueEas the value for empty (null) records.-T TmpDirβ where to put tmp files. also uses environment variableTMPDIR, if-Tis not specified. Default is/tmp.
π Sort specification options π
(can be interspersed with column names β mix and match, it's a vibe β¨)
-r,--descendingβ sort in reverse order (high to low)-R,--ascendingβ sort in normal order (low to high)-n,--numericβ sort numerically-N,--lexicalβ sort lexicographically
β Standard fsdb options β
this module also supports the standard fsdb options, bestie:
-dβ enable debugging output.-i InputSource,--input InputSourceβ read fromInputSource, typically a file name, or-for standard input, or (if in Perl) aIO::Handle,Fsdb::IOorFsdb::BoundedQueueobjects.-o OutputDestination,--output OutputDestinationβ write toOutputDestination, typically a file name, or-for standard output, or (if in Perl) aIO::Handle,Fsdb::IOorFsdb::BoundedQueueobjects.--autorun,--noautorunβ by default, programs process automatically, butFsdb::Filterobjects in Perl do not run until you invoke therun()method. the--(no)autorunoption controls that behavior within Perl.--helpβ show help.--manβ show full manual.
π SAMPLE USAGE π
Input:
#fsdb sid cid
1 10
2 11
1 12
2 12
And in the file DATA/classes:
#fsdb cid cname
10 pascal
11 numanal
12 os
Command:
cat DATA/reg.fsdb | dbsort -n cid | dbjoin -i - -i DATA/classes -n cid
Output:
#fsdb cid sid cname
10 1 pascal
11 2 numanal
12 1 os
12 2 os
# - COMMENTS:
# | /home/johnh/BIN/DB/dbsort -n cid
# DATA/classes COMMENTS:
# joined comments:
# | /home/johnh/BIN/DB/dbjoin - DATA/classes cid
π SEE ALSO π
Fsdb. (go read it, it's the whole ecosystem π)
π AUTHOR and COPYRIGHT π
Copyright (C) 1991-2022 by John Heidemann <johnh@isi.edu>
This program is distributed under terms of the GNU general public license, version 2. see the file COPYING with the distribution for details.
okay that's the whole page, bestie, you're officially an Fsdb join expert π this was perl v5.32.1, dated 2024-08-02, and it's the DBJOIN(1) page signing off β now go join some tables, you absolute icon πβ¨π¦
π¦ where this page comes from
- epel 9: perl-Fsdb 2:3.9-1.el9 Β· GPLv2
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms