示例#1
0
def autocomplete(request, database=None, table=None, column=None, nested=None):
  app_name = None if FORCE_HS2_METADATA.get() else get_app_name(request)

  do_as = request.user
  if (request.user.is_superuser or request.user.has_hue_permission(action="impersonate", app="security")) and 'doas' in request.GET:
    do_as = User.objects.get(username=request.GET.get('doas'))

  db = _get_db(user=do_as, source_type=app_name)

  response = _autocomplete(db, database, table, column, nested)
  return JsonResponse(response)
示例#2
0
文件: api.py 项目: cloudera/hue
def autocomplete(request, database=None, table=None, column=None, nested=None):
  cluster = request.POST.get('cluster')
  app_name = None if FORCE_HS2_METADATA.get() else get_app_name(request)

  do_as = request.user
  if (is_admin(request.user) or request.user.has_hue_permission(action="impersonate", app="security")) and 'doas' in request.GET:
    do_as = User.objects.get(username=request.GET.get('doas'))

  db = _get_db(user=do_as, source_type=app_name, cluster=cluster)

  response = _autocomplete(db, database, table, column, nested, cluster=cluster)
  return JsonResponse(response)
示例#3
0
def upload_table_stats(request):
    response = {'status': -1}

    interface = request.POST.get('interface', OPTIMIZER.INTERFACE.get())
    db_tables = json.loads(request.POST.get('db_tables', '[]'))
    source_platform = json.loads(request.POST.get('sourcePlatform', '"hive"'))
    with_ddl = json.loads(request.POST.get('with_ddl', 'false'))
    with_table_stats = json.loads(request.POST.get('with_table', 'false'))
    with_columns_stats = json.loads(request.POST.get('with_columns', 'false'))

    table_ddls = []
    table_stats = []
    column_stats = []

    if not OPTIMIZER.AUTO_UPLOAD_DDL.get():
        with_ddl = False

    if not OPTIMIZER.AUTO_UPLOAD_STATS.get():
        with_table_stats = with_columns_stats = False

    for db_table in db_tables:
        path = _get_table_name(db_table)

        try:
            if with_ddl:
                db = _get_db(request.user, source_type=source_platform)
                query = hql_query(
                    'SHOW CREATE TABLE `%(database)s`.`%(table)s`' % path)
                handle = db.execute_and_wait(query, timeout_sec=5.0)

                if handle:
                    result = db.fetch(handle, rows=5000)
                    db.close(handle)
                    table_ddls.append(
                        (0, 0, ' '.join([row[0] for row in result.rows()]),
                         path['database']))

            if with_table_stats:
                mock_request = MockRequest(user=request.user,
                                           source_platform=source_platform)
                full_table_stats = json.loads(
                    get_table_stats(mock_request,
                                    database=path['database'],
                                    table=path['table']).content)
                stats = dict((stat['data_type'], stat['comment'])
                             for stat in full_table_stats['stats'])

                table_stats.append({
                    'table_name':
                    '%(database)s.%(table)s' % path,  # DB Prefix
                    'num_rows':
                    stats.get('numRows', -1),
                    'last_modified_time':
                    stats.get('transient_lastDdlTime', -1),
                    'total_size':
                    stats.get('totalSize', -1),
                    'raw_data_size':
                    stats.get('rawDataSize', -1),
                    'num_files':
                    stats.get('numFiles', -1),
                    'num_partitions':
                    stats.get('numPartitions', -1),
                    # bytes_cached
                    # cache_replication
                    # format
                })

            if with_columns_stats:
                if source_platform == 'impala':
                    colum_stats = json.loads(
                        get_table_stats(mock_request,
                                        database=path['database'],
                                        table=path['table'],
                                        column=-1).content)['stats']
                else:
                    colum_stats = [
                        json.loads(
                            get_table_stats(mock_request,
                                            database=path['database'],
                                            table=path['table'],
                                            column=col).content)['stats']
                        for col in full_table_stats['columns'][:25]
                    ]

                raw_column_stats = [
                    dict([(key, val if val is not None else '')
                          for col_stat in col
                          for key, val in col_stat.items()])
                    for col in colum_stats
                ]

                for col_stats in raw_column_stats:
                    column_stats.append({
                        'table_name':
                        '%(database)s.%(table)s' % path,  # DB Prefix
                        'column_name':
                        col_stats['col_name'],
                        'data_type':
                        col_stats['data_type'],
                        "num_distinct":
                        int(col_stats.get('distinct_count'))
                        if col_stats.get('distinct_count') != '' else -1,
                        "num_nulls":
                        int(col_stats['num_nulls'])
                        if col_stats['num_nulls'] != '' else -1,
                        "avg_col_len":
                        int(float(col_stats['avg_col_len']))
                        if col_stats['avg_col_len'] != '' else -1,
                        "max_size":
                        int(float(col_stats['max_col_len']))
                        if col_stats['max_col_len'] != '' else -1,
                        "min":
                        col_stats['min']
                        if col_stats.get('min', '') != '' else -1,
                        "max":
                        col_stats['max']
                        if col_stats.get('max', '') != '' else -1,
                        "num_trues":
                        col_stats['num_trues']
                        if col_stats.get('num_trues', '') != '' else -1,
                        "num_falses":
                        col_stats['num_falses']
                        if col_stats.get('num_falses', '') != '' else -1,
                    })
        except Exception as e:
            LOG.exception('Skipping upload of %s: %s' % (db_table, e))

    api = get_api(request, interface)

    response['status'] = 0

    if table_stats:
        response['upload_table_stats'] = api.upload(
            data=table_stats,
            data_type='table_stats',
            source_platform=source_platform)
        response['upload_table_stats_status'] = 0 if response[
            'upload_table_stats']['status']['state'] in ('WAITING', 'FINISHED',
                                                         'IN_PROGRESS') else -1
        response['status'] = response['upload_table_stats_status']
    if column_stats:
        response['upload_cols_stats'] = api.upload(
            data=column_stats,
            data_type='cols_stats',
            source_platform=source_platform)
        response['upload_cols_stats_status'] = response['status'] if response[
            'upload_cols_stats']['status']['state'] in ('WAITING', 'FINISHED',
                                                        'IN_PROGRESS') else -1
        if response['upload_cols_stats_status'] != 0:
            response['status'] = response['upload_cols_stats_status']
    if table_ddls:
        response['upload_table_ddl'] = api.upload(
            data=table_ddls,
            data_type='queries',
            source_platform=source_platform)
        response['upload_table_ddl_status'] = response['status'] if response[
            'upload_table_ddl']['status']['state'] in ('WAITING', 'FINISHED',
                                                       'IN_PROGRESS') else -1
        if response['upload_table_ddl_status'] != 0:
            response['status'] = response['upload_table_ddl_status']

    return JsonResponse(response)