8

我需要从 zeppelin 中的 %sql 解释器以 csv 格式导出数据。我该怎么做?我需要添加一个按钮,然后单击它应该以 csv 格式导出数据,如客户端 sql 解释器中 zeppelin 中的图形所示。

4

2 回答 2

4

目前,不支持此功能(Zeppelin 0.5.6)。不过,这似乎将在下一个版本(0.6.0)中添加。您可以从Zeppelin git page克隆它,或者您可以使用我正在使用的下一个解决方法:

  1. 您需要尝试导出的笔记本和段落的 ID。您可以通过单击要导出的段落的选项菜单中的“链接此段落”来获取它们。当你这样做时,你会得到一个新窗口。ID 在新窗口的 url 中:http://localhost:8080/#/notebook/{Notebook-ID}/paragraph/{Paragraph-ID}?asIframe
  2. 使用Zeppelin Notebook API。发送 HTTP-GET 请求到http://localhost:8080/api/notebook/{Notebook-ID}/paragraph/{Paragraph-ID}
  3. 响应是一个 json。该字段body.result.msg是一个字符串,将结果保存为 TSV(制表符分隔值)。这几乎是您所需要的(您可以解析它并将\t字符串中的所有内容替换,为 CSV 文件)。

一个简单的代码可以让你立即解决这个问题。


编辑:

这是一个执行此操作的 Python 脚本。调用getTSV并发送您通过单击“链接此段落”获得的段落的 URL:

import requests
import json

def parseURL(paragraphUrl):
    url = paragraphUrl.split(":8080")
    address = url[0]
    vals = url[1].split("/")
    notebook = vals[3]
    paragraph = vals[5].split("?")[0]
    return [address, notebook, paragraph]

def getData(address, notebook, paragraph):
    response = requests.get(address + ":8080/api/notebook/" + notebook + "/paragraph/" + paragraph)
    return response.text

def getTSV(paragraphUrl):
    # This function gets the same url that you get from clicking on "Link this paragraph"
    [address, notebook, paragraph] = parseURL(paragraphUrl)
    response = getData(address,notebook,paragraph)
    return json.loads(response)["body"]["result"]["msg"]
于 2016-05-17T18:08:18.753 回答
1

这是shadedzy的代码移植到ruby,对于任何可能更喜欢它而不是python的人(比如我):

require 'net/http'
require 'json'

def get_zeppelin_data(paragraph_url)
  rx = %r{http://([\w\d]+):([\d]+)/?#/notebook/([\w\d]+)/paragraph/([\d\-_]+)}
  address, port, notebook_id, paragraph_id = paragraph_url.match(rx).captures
  api_url = "http://#{address}:#{port}/api/notebook/#{notebook_id}/paragraph/#{paragraph_id}"
  result = Net::HTTP.get(URI(api_url))
  data = JSON.parse(result)
  data["body"]["result"]["msg"]
end
于 2016-11-14T18:19:05.187 回答