首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >hue通过python执行查询

hue通过python执行查询
EN

Stack Overflow用户
提问于 2018-01-03 04:05:37
回答 1查看 1.4K关注 0票数 0

我知道如何使用铬色调查询。

我想使用Python查询。

我有色调帐户和密码。

问题:如何使用查询?

代码语言:javascript
运行
复制
def login_djangosite():
    import requests
    session = requests.Session()
    next_url = "/"
    login_url = "http://hue.bi.com/accounts/login/?next=/"
    r = session.get(login_url)
    form_data = dict(username=u'',password=u'',
      csrfmiddlewaretoken=session.cookies['csrftoken'],next=next_url)
    r = session.post(login_url, data=form_data, cookies=dict(), headers=dict(Referer=login_url))
     # check if request executed successfully?
    print(r.status_code)
    cookies = session.cookies
    headers = session.headers
    response=session.get('http://hue.bi.hujiang.com/beeswax/#query', 
              cookies=session.cookies, headers=session.headers)
    response.status_code
    response.text
EN

回答 1

Stack Overflow用户

发布于 2020-03-11 14:27:02

使用python脚本通过Hue提交Hive查询,并将结果作为csv文件下载。

测试顺化3.9,应为顺化3号工作。

Hue 4将编辑器名beeswax更改为hive,此脚本将无法工作,需要进行一些修改。

用法:

代码语言:javascript
运行
复制
python pyhue.py -d database -s query.sql -o result.csv

剧本:

代码语言:javascript
运行
复制
# pyhue.py
"""python登录Hue并查询. 首次使用请修改 BASE_URL, USERNAME 和 PASSWORD.
"""
__author__ = 'Yujian Yang and 0ut0fcontrol'
__version__ = '1.0.0'

import time
import requests


class Hue(requests.Session):
    BASE_URL = 'http://localhost:8000'
    USERNAME = 'test'
    PASSWORD = '123'

    def __init__(self, base_url=None):
        if base_url is None:
            self.base_url = self.BASE_URL
        else:
            self.base_url = base_url
        super(Hue, self).__init__()

    def login(self, username=None, password=None):
        if username is None:
            username = self.USERNAME
        if password is None:
            password = self.PASSWORD
        login_url = self.base_url + '/accounts/login/'
        self.get(login_url)
        form_data = dict(username=username,
                         password=password,
                         csrfmiddlewaretoken=self.cookies['csrftoken'],
                         next='/')

        r = self.post(login_url,
                      data=form_data,
                      cookies=dict(),
                      headers=dict(Referer=login_url))
        if r.status_code == 200:
            print('login succeeded for user [%s] at %s\n' %
                  (username, self.base_url))
        else:
            raise Exception('login failed for user [%s] at %s\n' %
                            (username, self.base_url))
        return r

    def beeswax(self, database, query, filename=None):
        beeswax_url = self.base_url + '/beeswax'

        query_data = {
            'query-query': query,
            'query-database': database,
            'settings-next_form_id': 0,
            'file_resources-next_form_id': 0,
            'functions-next_form_id': 0,
            'query-email_notify': False,
            'query-is_parameterized': True,
        }

        HEADERS = {
            'X-CSRFToken': self.cookies['csrftoken'],
            'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
            'Referer': beeswax_url,
        }
        self.headers.update(HEADERS)

        excecute_url = self.base_url + '/beeswax/api/query/execute/'

        r = self.post(
            excecute_url,
            data=query_data,
            headers=self.headers,
            cookies=self.cookies,
        )

        assert r.status_code == 200

        r_json = r.json()
        job_id = r_json['id']
        watch_url = self.base_url + r_json['watch_url']

        t_sec = 2
        t_try = 100
        t_tol = t_sec * t_try
        for i in range(t_try):
            print('waiting %3d/%d secs for job %d: %s ...' %
                  (t_sec * i, t_tol, job_id, query[:50]))
            r = self.post(
                watch_url,
                data=query_data,
                headers=self.headers,
                cookies=self.cookies,
            )
            r_json = r.json()
            if r_json['isSuccess']:
                break
            else:
                time.sleep(t_sec)
        csv_url = self.base_url + '/beeswax/download/%d/csv' % (job_id)

        r = self.get(
            csv_url,
            headers=self.headers,
            cookies=self.cookies,
        )
        if filename is not None:
            with open(filename, 'wb') as f:
                f.write(r.content)
            print('save result in %s\n' % (filename))
        return r


if __name__ == "__main__":

    import argparse
    parser = argparse.ArgumentParser(
        description=__doc__,
        formatter_class=argparse.RawDescriptionHelpFormatter,
        epilog='例子:\n'
        'python -d database -s query.sql -o result.csv\n'
        'python -d database -s q1.sql q2.sql # 输出 q1.sql.csv q2.sql.csv\n')
    parser.add_argument('-d', '--database', help='数据库名称', required=True)
    parser.add_argument('-s',
                        '--sql',
                        nargs='+',
                        help='一个或多个查询语句文件.',
                        required=True)
    parser.add_argument('-o', '--output', help='查询结果csv文件名, 默认为: sql文件名.csv')
    args = parser.parse_args()

    hue = Hue()
    hue.login()

    for q in args.sql:
        with open(q) as f:
            query = f.read()
        output = args.output
        if output is None:
            output = q + '.csv'
        hue.beeswax(args.database, query, output)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48071002

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档