Skip to content

Instantly share code, notes, and snippets.

@cgrand
Created February 15, 2017 15:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save cgrand/7a716327d1fad8db569c734cd3778b3f to your computer and use it in GitHub Desktop.
Save cgrand/7a716327d1fad8db569c734cd3778b3f to your computer and use it in GitHub Desktop.
Retro-spec-ing a dataframe
=> (ns user (:require [powderkeg.sql :as sql] [clojure.spec :as s]))
=> (s/def ::age int?)(s/def ::name string?) (s/def ::friends (s/* ::name))
:user/age
:user/name
:user/friends
=> (sql/df [{:name "Gaël" :age 6 :friends ["Alix"]}
{:name "Estelle" :age 4 :friends ["Léana"]}
{:name "Lilly" :age 1 :friends ["Tigger" "Cuddly"]}]
(s/keys :req-un [::name ::age ::friends]))
#object[org.apache.spark.sql.DataFrame 0x2f74149 "[name: string, age: bigint, friends: array<string>]"]
;; specs are preserved
=> (sql/spec-of *1)
(clojure.spec/keys
:req-un
[:user/name :user/age :user/friends])
=> (.registerTempTable *2 "kids")
nil
;; even through manipulations
=> (sql/exec "select name as `first-name`, age, size(friends) as `friends-count` from kids")
#object[org.apache.spark.sql.DataFrame 0x2d2d9b26 "[first-name: string, age: bigint, friends-count: int]"]
=> (sql/spec-of *1)
(clojure.spec/merge
(clojure.spec/keys
:req-un
[:user/age])
(powderkeg.sql/adhoc-map
:first-name
:user/name
:friends-count
clojure.core/int?))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment