Hive Sql erhält dynamisch null Spaltenanzahl aus einer Tabelle

8

Ich benutze Datastax + Spark-Integration und Spark SQL-Spar-Server, die mir eine Hive-SQL-Schnittstelle zur Abfrage der Tabellen in Cassandra gibt.

Die Tabellen in meiner Datenbank werden dynamisch erstellt, was ich tun möchte ist, eine Anzahl von Nullwerten in jeder Spalte für die Tabelle zu erhalten, die nur auf dem Tabellennamen basiert.

Ich kann die Spaltennamen mit describe database.table erhalten, aber in Hive SQL, wie verwende ich seine Ausgabe in einer anderen Select-Abfrage, die null für alle Spalten zählt.

Update 1: Rückverfolgung mit Dudus Lösung

  

Fehler beim Ausführen der Abfrage: TExecuteStatementResp (status = TStatus (errorCode = 0,   errorMessage="org.apache.spark.sql.AnalysisException: Ungültige Verwendung von   '*' in explode / json_tuple / UDTF; ", sqlState = None,   infoMessages = [" org.apache.hive.service.cli.HiveSQLException: org.apache.spark.sql.AnalysisException:   Ungültige Verwendung von '' in explode / json_tuple / UDTF;: 16: 15 ",   'org.apache.spark.sql.hive.thriftserver.SparkExecuteStatementOperation: org $ apache $ func $ sql $ hive $ thriftserver $ SparkExecuteStatementOperation $$ ausführen: SparkExecuteStatementOperation.scala: 258',   'org.apache.spark.sql.hive.thriftserver.SparkExecuteStatementOperation: runInternal: SparkExecuteStatementOperation.scala: 152',   'org.apache.hive.service.cli.operation.Operation: run: Operation.java: 257',   'org.apache.hive.service.cli.session.HiveSessionImpl: executeStatementInternal: HiveSessionImpl.java: 388',   'org.apache.hive.service.cli.session.HiveSessionImpl: executeStatement: HiveSessionImpl.java: 369',   'org.apache.hive.service.cli.CLIService: executeStatement: CLIService.java: 262',   'org.apache.hive.service.cli.thrift.ThriftCLIService: ExecuteStatement: ThriftCLIService.java: 437',   'org.apache.hive.service.cli.thrift.TCLIService $ Prozessor $ ExecuteStatement: getResult: TCLIService.java: 1313',   'org.apache.hive.service.cli.thrift.TCLIService $ Prozessor $ ExecuteStatement: getResult: TCLIService.java: 1298',   'org.apache.thrift.ProcessFunction: process: ProcessFunction.java: 39',   'org.apache.thrift.TBaseProcessor: Prozess: TBaseProcessor.java: 39',   'org.apache.hive.service.auth.TSetIpAddressProcessor: Prozess: TSetIpAddressProcessor.java: 56',   'org.apache.thrift.server.TThreadPoolServer $ WorkerProcess: run: TThreadPoolServer.java: 286',   'java.util.concurrent.ThreadPoolExecutor: runWorker: ThreadPoolExecutor.java: 1142',   'java.util.concurrent.ThreadPoolExecutor $ Worker: run: ThreadPoolExecutor.java: 617',   'java.lang.Thread: run: Thread.java: 745'], statusCode = 3),   operationHandle = Keine)

    
rajat 16.06.2017, 09:29
quelle

3 Antworten

4

In der folgenden Lösung müssen Sie nicht jede Spalte einzeln behandeln. Das Ergebnis ist ein Spaltenindex und die Anzahl der Nullwerte in dieser Spalte.
Sie können ihn später durch den Spaltenindex zu einer Information hinzufügen, die von dem Metastore abgerufen wird.
Eine Einschränkung besteht darin, dass Zeichenfolgen, die den exakten Text null enthalten, als Nullen gezählt werden.

Demo

Der CTE ( mytable wie von with mytable as definiert) kann offensichtlich durch eine tatsächliche Tabelle ersetzt werden

%Vor% %Vor%     
quelle
3

Anstatt database.table zu beschreiben, können Sie

verwenden

Select column_name from system_schema.columns where keyspace_name='YOUR KEYSPACE' and table_name='YOUR TABLE'

Es gibt auch eine Spalte namens kind in der obigen Tabelle mit Werten wie partition_key,clustering,regular .

Die Spalten mit den Werten partition_key und clustering haben keine Nullwerte.

Für andere Spalten können Sie

verwenden

select sum(CASE WHEN col1 is NULL THEN 1 ELSE 0 END) as col1_cnt,sum(CASE WHEN col2 is NULL THEN 1 ELSE 0 END) as col2_cnt from table1 where col1 is null;

Sie können auch unter Abfrage versuchen (nicht ausprobiert)

%Vor%

Kann für obige Abfrage sein Sie können Variable für count anstelle von count (*) jedes Mal erstellen.

Hinweis: system_schema.columns ist cassandra table und cassandra user sollte Leseberechtigung für diese Tabelle haben

    
undefined_variable 22.06.2017 07:09
quelle
-4

Sie müssen Nullwerte aus jeder Spalte separat zählen. Zum Beispiel -

%Vor%     
Ravi Yadav 22.06.2017 06:56
quelle

Tags und Links