Zum Inhalt springen

CLI-Diagramme mit YouPlot

DuckDB lässt sich mit CLI-Grafiktools verwenden, um Eingaben schnell nach stdout zu pipen und Ihre Daten in einer Zeile darzustellen.

YouPlot ist ein Ruby-basiertes CLI-Tool zum Zeichnen ansprechender Diagramme im Terminal. Es kann Eingaben anderer Programme entgegennehmen, indem Daten von stdin gepiped werden. Es nimmt tabulatorgetrennte Daten entgegen (oder mit einem Trennzeichen Ihrer Wahl) und kann leicht verschiedene Diagrammtypen erzeugen, darunter Balken-, Linien-, Histogramm- und Streudiagramme.

Mit DuckDB können Sie mit dem Befehl TO '/dev/stdout' auf die Konsole (stdout) schreiben. Und Sie können kommagetrennte Werte schreiben, indem Sie WITH (FORMAT csv, HEADER) verwenden.

YouPlot installieren

Installationsanweisungen für YouPlot finden Sie im YouPlot-Haupt-Repository. Unter macOS können Sie verwenden:

Terminal window
brew install youplot

Führen Sie uplot --help aus, um sicherzustellen, dass die Installation erfolgreich war!

DuckDB-Abfragen nach stdout pipen

Indem Sie die Funktion COPY...TO mit einer CSV-Ausgabedatei kombinieren, können Sie Daten aus jedem von DuckDB unterstützten Format lesen und an YouPlot pipen. Folgen Sie diesen drei Schritten:

  1. Lesen Sie zuerst alle Daten aus input.json:

    Terminal window
    duckdb -s "SELECT * FROM read_json('input.json')"
  2. Um die Daten für YouPlot vorzubereiten, schreiben Sie eine einfache Aggregation:

    Terminal window
    duckdb -s "SELECT date, sum(purchases) AS total_purchases FROM read_json('input.json') GROUP BY 1 ORDER BY 2 DESC LIMIT 10"
  3. Schließen Sie den SELECT schließlich in die Funktion COPY ... TO mit dem Ausgabeort /dev/stdout ein.

    Die Syntax sieht so aus:

    COPY (⟨query⟩) TO '/dev/stdout' WITH (FORMAT csv, HEADER);

    Der folgende vollständige DuckDB-Befehl gibt die Abfrage im CSV-Format mit Kopfzeile aus:

    Terminal window
    duckdb -s "COPY (SELECT date, sum(purchases) AS total_purchases FROM read_json('input.json') GROUP BY 1 ORDER BY 2 DESC LIMIT 10) TO '/dev/stdout' WITH (FORMAT csv, HEADER)"

DuckDB mit YouPlot verbinden

Schließlich können die Daten nun an YouPlot gepiped werden! Angenommen, wir haben eine Datei input.json mit Datumsangaben und der Anzahl der Einkäufe, die jemand an diesem Datum getätigt hat. Mit der Abfrage oben pipen wir die Daten an den Befehl uplot, um ein Diagramm der Top-10-Einkaufsdaten zu zeichnen.

Terminal window
duckdb -s "COPY (SELECT date, sum(purchases) AS total_purchases FROM read_json('input.json') GROUP BY 1 ORDER BY 2 DESC LIMIT 10) TO '/dev/stdout' WITH (FORMAT csv, HEADER)" \
| uplot bar -d, -H -t "Top 10 Purchase Dates"

Damit wird uplot angewiesen, ein Balkendiagramm zu zeichnen, ein kommagetrenntes Trennzeichen zu verwenden (-d,), dass die Daten eine Kopfzeile haben (-H), und dem Diagramm einen Titel zu geben (-t).

youplot-top-10

Weiteres Beispiel: stdin + stdout

Möglicherweise pipen Sie Daten durch jq oder laden eine JSON-Datei von irgendwo herunter. Sie können DuckDB auch anweisen, Daten aus einem anderen Prozess zu lesen, indem Sie den Dateinamen auf /dev/stdin setzen.

Kombinieren wir das mit einem schnellen curl von GitHub, um zu sehen, was ein bestimmter Nutzer zuletzt gemacht hat.

Terminal window
curl -sL "https://api.github.com/users/dacort/events?per_page=100" \
| duckdb -s "COPY (SELECT type, count(*) AS event_count FROM read_json('/dev/stdin') GROUP BY 1 ORDER BY 2 DESC LIMIT 10) TO '/dev/stdout' WITH (FORMAT csv, HEADER)" \
| uplot bar -d, -H -t "GitHub Events for @dacort"

github-events