@@ -179,7 +179,6 @@ class HS2Api(Api):
179
179
def get_properties (lang = 'hive' ):
180
180
return ImpalaConfiguration .PROPERTIES if lang == 'impala' else HiveConfiguration .PROPERTIES
181
181
182
-
183
182
@query_error_handler
184
183
def create_session (self , lang = 'hive' , properties = None ):
185
184
application = 'beeswax' if lang == 'hive' or lang == 'llap' else lang
@@ -246,7 +245,6 @@ def create_session(self, lang='hive', properties=None):
246
245
247
246
return response
248
247
249
-
250
248
@query_error_handler
251
249
def close_session (self , session ):
252
250
app_name = session .get ('type' )
@@ -281,7 +279,6 @@ def close_session(self, session):
281
279
282
280
return response
283
281
284
-
285
282
def close_session_idle (self , notebook , session ):
286
283
idle = True
287
284
response = {'result' : []}
@@ -317,16 +314,14 @@ def execute(self, notebook, snippet):
317
314
db = self ._get_db (snippet , interpreter = self .interpreter )
318
315
319
316
statement = self ._get_current_statement (notebook , snippet )
320
- compute = snippet .get ('compute' , {})
321
- session_type = compute ['name' ] if is_compute (snippet ) and compute .get ('name' ) else snippet ['type' ]
317
+ session_type = self ._find_session_type (snippet )
322
318
session = self ._get_session (notebook , session_type )
323
319
324
320
query = self ._prepare_hql_query (snippet , statement ['statement' ], session )
325
321
_session = self ._get_session_by_id (notebook , session_type )
326
322
327
-
328
323
try :
329
- if statement .get ('statement_id' ) == 0 : # TODO: move this to client
324
+ if statement .get ('statement_id' ) == 0 : # TODO: move this to client
330
325
if query .database and not statement ['statement' ].lower ().startswith ('set' ):
331
326
result = db .use (query .database , session = _session )
332
327
if result .session :
@@ -356,6 +351,14 @@ def execute(self, notebook, snippet):
356
351
357
352
return response
358
353
354
+ def _find_session_type (self , snippet ):
355
+ compute = snippet .get ('compute' , {})
356
+ if is_compute (snippet ) and compute .get ('name' ):
357
+ return compute ['name' ]
358
+ connector = snippet .get ('connector' , {})
359
+ if connector and connector .get ('name' ):
360
+ return connector ['name' ]
361
+ return snippet .get ('type' )
359
362
360
363
@query_error_handler
361
364
def check_status (self , notebook , snippet ):
@@ -384,7 +387,6 @@ def check_status(self, notebook, snippet):
384
387
385
388
return response
386
389
387
-
388
390
@query_error_handler
389
391
def fetch_result (self , notebook , snippet , rows , start_over ):
390
392
db = self ._get_db (snippet , interpreter = self .interpreter )
@@ -411,7 +413,6 @@ def fetch_result(self, notebook, snippet, rows, start_over):
411
413
'type' : 'table'
412
414
}
413
415
414
-
415
416
@query_error_handler
416
417
def fetch_result_size (self , notebook , snippet ):
417
418
resp = {
@@ -440,7 +441,6 @@ def fetch_result_size(self, notebook, snippet):
440
441
441
442
return resp
442
443
443
-
444
444
@query_error_handler
445
445
def cancel (self , notebook , snippet ):
446
446
db = self ._get_db (snippet , interpreter = self .interpreter )
@@ -449,15 +449,13 @@ def cancel(self, notebook, snippet):
449
449
db .cancel_operation (handle )
450
450
return {'status' : 0 }
451
451
452
-
453
452
@query_error_handler
454
453
def get_log (self , notebook , snippet , startFrom = None , size = None ):
455
454
db = self ._get_db (snippet , interpreter = self .interpreter )
456
455
457
456
handle = self ._get_handle (snippet )
458
457
return db .get_log (handle , start_over = startFrom == 0 )
459
458
460
-
461
459
@query_error_handler
462
460
def close_statement (self , notebook , snippet ):
463
461
db = self ._get_db (snippet , interpreter = self .interpreter )
@@ -472,7 +470,6 @@ def close_statement(self, notebook, snippet):
472
470
raise e
473
471
return {'status' : 0 }
474
472
475
-
476
473
def can_start_over (self , notebook , snippet ):
477
474
try :
478
475
db = self ._get_db (snippet , interpreter = self .interpreter )
@@ -484,13 +481,12 @@ def can_start_over(self, notebook, snippet):
484
481
raise e
485
482
return can_start_over
486
483
487
-
488
484
@query_error_handler
489
485
def progress (self , notebook , snippet , logs = '' ):
490
486
patch_snippet_for_connector (snippet )
491
487
492
488
if snippet ['dialect' ] == 'hive' :
493
- match = re .search ('Total jobs = (\d+)' , logs , re .MULTILINE )
489
+ match = re .search (r 'Total jobs = (\d+)' , logs , re .MULTILINE )
494
490
total = int (match .group (1 )) if match else 1
495
491
496
492
started = logs .count ('Starting Job' )
@@ -499,13 +495,12 @@ def progress(self, notebook, snippet, logs=''):
499
495
progress = int ((started + ended ) * 100 / (total * 2 ))
500
496
return max (progress , 5 ) # Return 5% progress as a minimum
501
497
elif snippet ['dialect' ] == 'impala' :
502
- match = re .findall ('(\d+)% Complete' , logs , re .MULTILINE )
498
+ match = re .findall (r '(\d+)% Complete' , logs , re .MULTILINE )
503
499
# Retrieve the last reported progress percentage if it exists
504
500
return int (match [- 1 ]) if match and isinstance (match , list ) else 0
505
501
else :
506
502
return 50
507
503
508
-
509
504
@query_error_handler
510
505
def get_jobs (self , notebook , snippet , logs ):
511
506
jobs = []
@@ -552,7 +547,6 @@ def get_jobs(self, notebook, snippet, logs):
552
547
553
548
return jobs
554
549
555
-
556
550
@query_error_handler
557
551
def autocomplete (self , snippet , database = None , table = None , column = None , nested = None , operation = None ):
558
552
db = self ._get_db (snippet , interpreter = self .interpreter )
@@ -577,7 +571,6 @@ def autocomplete(self, snippet, database=None, table=None, column=None, nested=N
577
571
578
572
return resp
579
573
580
-
581
574
@query_error_handler
582
575
def get_sample_data (self , snippet , database = None , table = None , column = None , is_async = False , operation = None ):
583
576
try :
@@ -586,7 +579,6 @@ def get_sample_data(self, snippet, database=None, table=None, column=None, is_as
586
579
except QueryServerException as ex :
587
580
raise QueryError (ex .message )
588
581
589
-
590
582
@query_error_handler
591
583
def explain (self , notebook , snippet ):
592
584
db = self ._get_db (snippet , interpreter = self .interpreter )
@@ -613,7 +605,6 @@ def explain(self, notebook, snippet):
613
605
'statement' : statement ,
614
606
}
615
607
616
-
617
608
@query_error_handler
618
609
def export_data_as_hdfs_file (self , snippet , target_file , overwrite ):
619
610
db = self ._get_db (snippet , interpreter = self .interpreter )
@@ -626,8 +617,7 @@ def export_data_as_hdfs_file(self, snippet, target_file, overwrite):
626
617
627
618
return '/filebrowser/view=%s' % urllib_quote (
628
619
urllib_quote (target_file .encode ('utf-8' ), safe = SAFE_CHARACTERS_URI_COMPONENTS )
629
- ) # Quote twice, because of issue in the routing on client
630
-
620
+ ) # Quote twice, because of issue in the routing on client
631
621
632
622
def export_data_as_table (self , notebook , snippet , destination , is_temporary = False , location = None ):
633
623
db = self ._get_db (snippet , interpreter = self .interpreter )
@@ -654,7 +644,6 @@ def export_data_as_table(self, notebook, snippet, destination, is_temporary=Fals
654
644
655
645
return hql , success_url
656
646
657
-
658
647
def export_large_data_to_hdfs (self , notebook , snippet , destination ):
659
648
response = self ._get_current_statement (notebook , snippet )
660
649
session = self ._get_session (notebook , snippet ['type' ])
@@ -684,7 +673,6 @@ def export_large_data_to_hdfs(self, notebook, snippet, destination):
684
673
685
674
return hql , success_url
686
675
687
-
688
676
def upgrade_properties (self , lang = 'hive' , properties = None ):
689
677
upgraded_properties = copy .deepcopy (self .get_properties (lang ))
690
678
@@ -708,7 +696,6 @@ def upgrade_properties(self, lang='hive', properties=None):
708
696
709
697
return upgraded_properties
710
698
711
-
712
699
def _get_session (self , notebook , type = 'hive' ):
713
700
session = next ((session for session in notebook ['sessions' ] if session ['type' ] == type ), None )
714
701
return session
@@ -723,7 +710,6 @@ def _get_session_by_id(self, notebook, type='hive'):
723
710
filters ['owner' ] = self .user
724
711
return Session .objects .get (** filters )
725
712
726
-
727
713
def _get_hive_execution_engine (self , notebook , snippet ):
728
714
# Get hive.execution.engine from snippet properties, if none, then get from session
729
715
properties = snippet ['properties' ]
@@ -746,7 +732,6 @@ def _get_hive_execution_engine(self, notebook, snippet):
746
732
747
733
return engine
748
734
749
-
750
735
def _prepare_hql_query (self , snippet , statement , session ):
751
736
settings = snippet ['properties' ].get ('settings' , None )
752
737
file_resources = snippet ['properties' ].get ('files' , None )
@@ -775,7 +760,6 @@ def _prepare_hql_query(self, snippet, statement, session):
775
760
database = database
776
761
)
777
762
778
-
779
763
def get_browse_query (self , snippet , database , table , partition_spec = None ):
780
764
db = self ._get_db (snippet , interpreter = self .interpreter )
781
765
table = db .get_table (database , table )
@@ -789,7 +773,6 @@ def get_browse_query(self, snippet, database, table, partition_spec=None):
789
773
else :
790
774
return db .get_select_star_query (database , table , limit = 100 )
791
775
792
-
793
776
def _get_handle (self , snippet ):
794
777
try :
795
778
handle = snippet ['result' ]['handle' ].copy ()
@@ -805,7 +788,6 @@ def _get_handle(self, snippet):
805
788
806
789
return HiveServerQueryHandle (** handle )
807
790
808
-
809
791
def _get_db (self , snippet , is_async = False , interpreter = None ):
810
792
if interpreter and interpreter .get ('dialect' ):
811
793
dialect = interpreter ['dialect' ]
@@ -828,7 +810,6 @@ def _get_db(self, snippet, is_async=False, interpreter=None):
828
810
# Note: name is not used if interpreter is present
829
811
return dbms .get (self .user , query_server = get_query_server_config (name = name , connector = interpreter ))
830
812
831
-
832
813
def _parse_job_counters (self , job_id ):
833
814
# Attempt to fetch total records from the job's Hive counter
834
815
total_records , total_size = None , None
@@ -864,7 +845,6 @@ def _parse_job_counters(self, job_id):
864
845
865
846
return total_records , total_size
866
847
867
-
868
848
def _get_hive_result_size (self , notebook , snippet ):
869
849
total_records , total_size , msg = None , None , None
870
850
engine = self ._get_hive_execution_engine (notebook , snippet ).lower ()
@@ -879,8 +859,8 @@ def _get_hive_result_size(self, notebook, snippet):
879
859
else :
880
860
msg = _ ('Hive query did not execute any jobs.' )
881
861
elif engine == 'spark' :
882
- total_records_re = "RECORDS_OUT_0: (?P<total_records>\d+)"
883
- total_size_re = "Spark Job\[[a-z0-9-]+\] Metrics[A-Za-z0-9:\s]+ResultSize: (?P<total_size>\d+)"
862
+ total_records_re = r "RECORDS_OUT_0: (?P<total_records>\d+)"
863
+ total_size_re = r "Spark Job\[[a-z0-9-]+\] Metrics[A-Za-z0-9:\s]+ResultSize: (?P<total_size>\d+)"
884
864
total_records_match = re .search (total_records_re , logs , re .MULTILINE )
885
865
total_size_match = re .search (total_size_re , logs , re .MULTILINE )
886
866
@@ -891,7 +871,6 @@ def _get_hive_result_size(self, notebook, snippet):
891
871
892
872
return total_records , total_size , msg
893
873
894
-
895
874
def _get_impala_result_size (self , notebook , snippet ):
896
875
total_records_match = None
897
876
total_records , total_size , msg = None , None , None
@@ -904,7 +883,7 @@ def _get_impala_result_size(self, notebook, snippet):
904
883
905
884
fragment = self ._get_impala_query_profile (server_url , query_id = query_id )
906
885
total_records_re = \
907
- "Coordinator Fragment F\d\d.+?RowsReturned: \d+(?:.\d+[KMB])? \((?P<total_records>\d+)\).*?(Averaged Fragment F\d\d)"
886
+ r "Coordinator Fragment F\d\d.+?RowsReturned: \d+(?:.\d+[KMB])? \((?P<total_records>\d+)\).*?(Averaged Fragment F\d\d)"
908
887
total_records_match = re .search (total_records_re , fragment , re .MULTILINE | re .DOTALL )
909
888
910
889
if total_records_match :
@@ -917,7 +896,6 @@ def _get_impala_result_size(self, notebook, snippet):
917
896
918
897
return total_records , total_size , msg
919
898
920
-
921
899
def _get_impala_query_id (self , snippet ):
922
900
guid = None
923
901
if 'result' in snippet and 'handle' in snippet ['result' ] and 'guid' in snippet ['result' ]['handle' ]:
@@ -929,7 +907,6 @@ def _get_impala_query_id(self, snippet):
929
907
LOG .warning ('Snippet does not contain a valid result handle, cannot extract Impala query ID.' )
930
908
return guid
931
909
932
-
933
910
def _get_impala_query_profile (self , server_url , query_id ):
934
911
api = get_impalad_api (user = self .user , url = server_url )
935
912
@@ -944,18 +921,15 @@ def _get_impala_query_profile(self, server_url, query_id):
944
921
945
922
return profile
946
923
947
-
948
924
def _get_impala_profile_plan (self , query_id , profile ):
949
- query_plan_re = "Query \(id=%(query_id)s\):.+?Execution Profile %(query_id)s" % {'query_id' : query_id }
925
+ query_plan_re = r "Query \(id=%(query_id)s\):.+?Execution Profile %(query_id)s" % {'query_id' : query_id }
950
926
query_plan_match = re .search (query_plan_re , profile , re .MULTILINE | re .DOTALL )
951
927
return query_plan_match .group () if query_plan_match else None
952
928
953
-
954
929
def describe_column (self , notebook , snippet , database = None , table = None , column = None ):
955
930
db = self ._get_db (snippet , interpreter = self .interpreter )
956
931
return db .get_table_columns_stats (database , table , column )
957
932
958
-
959
933
def describe_table (self , notebook , snippet , database = None , table = None ):
960
934
db = self ._get_db (snippet , interpreter = self .interpreter )
961
935
tb = db .get_table (database , table )
0 commit comments