2017-08-27 75 views
2

我正在使用數據源API實現我自己的數據源。關係的buildScan不顯示過濾器

我用了幾個文件我在網上找到,並用下面的代碼上來:

public class MyRelation extends BaseRelation implements TableScan, PrunedScan, PrunedFilteredScan { 
    public RDD<Row> buildScan(String[] requiredColumns, Filter[] filters) { 
    System.out.println(Arrays.toString(filters)); 
    } 
} 

我使用下面的查詢得到空過濾器:

SELECT field1,field2,field3 from table WHERE field2>4 AND field3=1000 

我跑:

SQLContext sqc = new SQLContext(sparkContext); 
Dataset<Row> sqlResult = sqc.sql(query).where("field2 > 4").filter("field2 > 15"); 

正如你所看到的,我也嘗試了API的filterwhere函數,但沒有任何工作。

我也試過unhandledFilters功能這是空白:

public Filter[] unhandledFilters(Filter[] filters) 
{ 
    System.out.println(Arrays.toString(filters)); 
    return filters; 
} 

我期待得到過濾器「字段2> 15」和其他人filters數組中,但它是空白。

任何想法我做錯了什麼,可以做些什麼來解決這個問題?

P.S.我確實實現了TableScan和PrunedScan,並調用了正確的方法,當我運行沒有where子句的查詢並且沒有篩選器時仍然調用帶有篩選器(從PrunedFilteredScan繼承)的函數。

回答

1

對於任何試圖完成相同任務的人,我可以通過實現CatalystScan接口來解決問題。催化劑是AQL查詢優化機制,實現了這個接口,並編寫以下功能的伎倆:

@Override 
public RDD<Row> buildScan(Seq<Attribute> requiredColumns, Seq<Expression> filters) { ... } 
+0

請接受你的答案:) –