org-babel文学分析简介
目录
作为分析和数据基础设施团队的一名工程师,我花了相当多的时间在临时性地探索和执行分散在SQL数据库,Hive和Spark集群,blob存储中的数据上。 这些调查工作很繁琐——一个实例就可能涉及多个ETL步骤、评估是否需要清理数据,以及在REPL和用于生产的程序之间移动代码。
一旦得出了最初的结论,我需要回顾并为后面的人记录我的处理过程,准确地记录在这过程中发生的事情。 这是一个发现错误和疏漏的方法,所以为什么不一边执行一边记录呢?
我需要做的是:
- 记录每个命令
- 记录它做了什么,为什么有必要做
- 边执行边检查结果
org-mode 和 org-babel 为这类多语言、多模式的任务提供了一个令人惊奇的环境。文章和代码可以自由地混合在一个文学编程风格中,处理过程中使用的任何引用都可以被声明,而且最终的产品可以导出为人或机器可读的格式。
如果你想看一份分析的最终结果,这里有一个例子是我最近为与陌生人喝茶创建的,报告了最近几个月的增长情况,这份报告体现了这些能力。
开始
由于我通常在类似sql的数据存储中开始我的探索,所以我就以此为例。
emacs 自带了 sql-mode 和 ob-sql,所以你所要做的就是允许在 org-babel 环境中执行SQL的 代码 块; 为此,需要在 init.el 中添加以下内容:
(add-to-list 'org-babel-load-languages '(sql . t)) ;;If you also want to disable confirmation for SQL blocks: (setq org-confirm-babel-evaluate (lambda (lang body) (not (string= lang "sql")))) ;;or disable it for all blocks (setq org-confirm-babel-evaluate nil)
注意:如果你想了解更多关于如何
babel的评价,其info页面非常完整;可以调用(info "(org) Evaluating code blocks")查看。
src blocks accept a variety of arguments that control the behaviour of their output and export.
现在已经配置好了 org-babel,该创建一个新 org buffer并添加一些属性来配置SQL环境了。
src 块接受各种参数来控制其输出和导出行为。
- #+PROPERTY: header-args:sql :session literate-analytics :engine postgresql
- 这一行将两个默认参数添加到任何 sqlsrcblock中,这两个参数是::session和:engine.前者 为我们的SQL块启用了会话执行,后者告诉sql-mode我们工作的后端是postgresql; 这相当于在sql-modebuffer中使用了sql-set-product.
- #+PROPERTY: header-args:sql+ :exports results :database tws_dev
- sql后面的- +表示允许附加参数到现有参数,而不是覆盖它们.- :exports results表示- src块的输出将被包含在- org-export后端的输出中。最后,- :database是传递给SQL客户机的连接字符串。
现在,通过键入 <s TAB sql 在 sql-mode 中添加一个 src 块(译者注,这个里放写的有问题,是在org-mode中添加一个SQL的src块)。
这个块内的内容将被语法高亮显示,就像它们在自己的缓冲区中一样,在光标放在块中内容上后,通过输如 C-c ',你可以在一个有恰当mode的buffer中编辑块内容。
你的bffer现在应该是这样的:
#+PROPERTY: header-args:sql :session literate-analytics :engine postgresql #+PROPERTY: header-args:sql+ :exports results :database tws_dev #+BEGIN_SRC sql SELECT COUNT(*) FROM users; #+END_SRC
现在,将您的o港币啊放在 src 块中,并通过 C-c C-c 调用 org-babel-execute-src-block.如果配置正确,应该会在下面插入 RESULT 块:
#+RESULTS: | count | |-------| | 5 |
结果将自动强制转换为 org 表格,如果您希望处理一些表格,或者使用 elisp 执行一些过滤操作,或者希望稍后通过 org-export 导出执行结果,这个特性非常有用。
通过TRAMP使用远程资源
由于你很少会遇到只与本地资源交互的情况,因此能够在其他机器上运行命令非常有用。
例如,我们经常通过 ssh 登陆Hadoop集群的头节点中来重命名、移动或查找HDFS中的文件。幸运的是, babel 与TRAMP 结合非常紧密。
src 块的 :dir 属性接受一个TRAMP引用;然后就可以在远程机器上执行block了,像这样:
#+BEGIN_SRC sh :dir /ssh:spark: :results output list hdfs dfs -ls $hdfsPath/ServiceInterface #+END_SRC #+RESULTS: : - Found 5 items : - drwxrwxrwx+ - ... 0 2018-04-25 17:06 $hdfsPath/ServiceInterface/Delinked : - drwxrwxrwx+ - ... 0 2018-04-25 16:43 $hdfsPath/ServiceInterface/PartialValidated : - drwxrwxrwx+ - ... 0 2018-04-23 19:58 $hdfsPath/ServiceInterface/PreValidated : - drwxrwxrwx+ - ... 0 2018-04-25 21:24 $hdfsPath/ServiceInterface/Unvalidated
如果要在同一台远程机器上执行多个命令,可以使用 :session 头参数来保持连接处于打开状态。参见session的info页面了解详情。
进一步阅读
我只介绍了 org-babel 的一小部分功能,但希望它能给您一些启发。
要进一步阅读,我建议观看[[https://www.youtube.com/watch?]v=dljNabciEGg][Howard Abram在Emacs会议上的Literate DevOps with emacs]] 并细读 babel 的 info 手册。
