2017-03-16 5 views
-1

Ich versuche, eine 'SQL' Abfrage auf einem Spark DataFrame auszuführen. Ich habe den Namen des df als Tabelle registriert und jetzt versuche ich, eine Auswahl auf einer Spalte auszuführen, wo ich ein udf anwende und dann die Reihen aufnehme, die eine bestimmte Bedingung bestehen.Spark SQL "Spalte auswählen AS ..." Spalte nicht finden

Das Problem ist, dass auf meine WHERE-Klausel verweist die modifizierte Spalte, aber es ist nicht in der Lage, die Namen mit AS deklariert zu sehen.

DataFrame df = sqlContext.read() 
      .format("com.databricks.spark.csv") 
      .option("header", "true") 
      .option("delimiter", delimiter) 
      .load(path); 
    df.registerTempTable("df"); 

    String sqlDfQuery = "SELECT parseDateTime(start) as start1 FROM df WHERE start1 > 1"; 
    if (sqlContext.sql(sqlDfQuery).take(1) != null) return true; 

wenn ich laufe, dass ich zurück

org.apache.spark.sql.AnalysisException bin immer: kann 'Start1' gegeben Eingabespalten nicht lösen: [Partituren, beginnen, ...

parseDateTime ist ein UDF wie die

sqlContext.udf().register("parseDateTime", (String dt) -> new DateTime(dt).getMillis(), DataTypes.LongType); 

Sh

definiert Würde ich das nicht versuchen?

Antwort

0

Dies passiert, weil es die Filter vor Aliasen anwendet.

Sie könnten eine verschachtelte SELECT-Anweisung ausführen, um dieses Problem zu lösen. Etwas wie das Folgende:

String sqlDfQuery = "SELECT start1 FROM (
           SELECT parseDateTime(start) AS start1 FROM df) TMP 
        WHERE start1 > 1 "; 
Verwandte Themen