2016-01-06 20 views
5

Tôi cần xuất dữ liệu ở định dạng csv từ trình thông dịch% sql của tôi trong zeppelin. Làm thế nào tôi có thể làm như vậy? Tôi cần phải thêm một nút và khi nhấp vào nó sẽ xuất dữ liệu trong csv như được hiển thị bởi các đồ thị trong zeppelin trong thông dịch sql ở phía máy khách.xuất dữ liệu trong csv bằng zeppelin

Trả lời

3

Hiện tại, tính năng này không được hỗ trợ (Zeppelin 0.5.6). Tuy nhiên, có vẻ như điều này sẽ được thêm vào trong phiên bản tiếp theo (0.6.0). Bạn có thể sao chép nó từ Zeppelin git page hoặc bạn có thể sử dụng công việc tiếp theo mà tôi đang sử dụng:

  1. Bạn sẽ cần ID của sổ ghi chép và đoạn bạn muốn xuất. Bạn có thể lấy chúng bằng cách nhấp vào "Liên kết đoạn này" trong menu tùy chọn của đoạn bạn muốn xuất. Khi bạn làm điều đó, bạn sẽ nhận được một cửa sổ mới. Các ID nằm trong url của cửa sổ mới: http://localhost:8080/#/notebook/{Notebook-ID}/paragraph/{Paragraph-ID}?asIframe
  2. Sử dụng Zeppelin Notebook API. Gửi yêu cầu HTTP-GET tới http://localhost:8080/api/notebook/{Notebook-ID}/paragraph/{Paragraph-ID}
  3. Phản hồi là một json. Trường body.result.msg là một chuỗi giữ kết quả là TSV (Giá trị được phân tách bằng tab). Điều này là khá nhiều những gì bạn cần (bạn có thể phân tích nó và thay thế tất cả \t trong chuỗi với , để có được một tệp CSV).

Một mã đơn giản có thể giúp bạn làm việc này nhanh chóng.


EDIT:

Dưới đây là một kịch bản Python mà không chính xác này. Gọi getTSV và gửi nó url của đoạn bạn nhận được từ cách nhấn vào "Liên kết đoạn này":

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"] 
+0

Chú ý Zeppelin chỉ hiển thị 1000 hàng đầu tiên. –

+0

Chỉ trong giao diện người dùng SQL. Kịch bản này cung cấp tất cả các dữ liệu – shakedzy

+0

Lạ lùng, trong nguồn tôi có thể đọc một giới hạn như vậy (xem https://github.com/apache/zeppelin/blob/master/jdbc/src/main/java/org/apache/zeppelin/jdbc /JDBCInterpreter.java#L540), isnit? –

1

Đây là mã shakedzy của chuyển đến ruby, cho bất cứ ai có thể thích nó hơn trăn (như tôi):

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 
Các vấn đề liên quan