2017-03-16 39 views
-1

我試圖在Spark DataFrame上運行'SQL'查詢。我已經將df的名稱註冊爲表格,現在我正嘗試在應用udf的列上運行選擇,然後拾取通過特定條件的行。Spark SQL「select column AS ...」找不到列

問題是,我的WHERE子句引用修改的列,但無法看到使用AS聲明的名稱。

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; 

當我跑,我又回到

org.apache.spark.sql.AnalysisException:無法解析 '啓動1' 給定的輸入列:[分數,啓動,...

parseDateTime就是這樣

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

噓定義的UDF我不應該這樣做嗎?

回答

0

發生這種情況是因爲它在別名之前應用了過濾器。

你可以做一個嵌套的select語句來解決這個問題。 類似如下:

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