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)
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.
Der CTE ( mytable
wie von with mytable as
definiert) kann offensichtlich durch eine tatsächliche Tabelle ersetzt werden
Anstatt database.table
zu beschreiben, können Sie
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
Sie müssen Nullwerte aus jeder Spalte separat zählen. Zum Beispiel -
%Vor%Tags und Links hive hiveql apache-spark-sql