Spark过滤器永远不会应用于Java中的DataFrame

时间:2015-07-08 15:19:20

标签: java oracle apache-spark dataframe

我是Spark的新手,我有一个查询可以从两个Oracle表中获取数据。这些表必须由一个字段连接,该字段与下面的代码一起使用。但是,我需要在Oracle“where”子句中应用过滤器。例如,带上年龄介于25到50之间的员工。我还必须应用GroupBy过滤器并使用OrderBy对最终结果进行排序。问题是,正确执行的唯一操作是从表中检索所有数据以及它们之间的连接。其余的过滤器根本没有应用,我不知道为什么。你能帮我解决这个问题吗?我确信我遗失了一些东西,因为没有编译错误。数据加载正常,但“where”子句似乎对数据没有任何影响,尽管有年龄在25到50之间的员工。非常感谢!

public static JavaRDD<Row> getResultsFromQuery(String connectionUrl) {

    JavaSparkContext sparkContext = new JavaSparkContext(new SparkConf()
            .setAppName("SparkJdbcDs").setMaster("local"));
    SQLContext sqlContext = new SQLContext(sparkContext);

    Map<String, String> options = new HashMap<>();
    options.put("driver", "oracle.jdbc.OracleDriver");
    options.put("url", connectionUrl);
    options.put("dbtable", "EMPLOYEE");

    DataFrameReader dataFrameReader = sqlContext.read().format("jdbc")
            .options(options);

    DataFrame dataFrameFirstTable = dataFrameReader.load();

    options.put("dbtable", "DEPARTMENT");

    dataFrameReader = sqlContext.read().format("jdbc").options(options);

    DataFrame dataFrameSecondTable = dataFrameReader.load();

    //JOIN. IT WORKS JUST FINE!!!

    DataFrame resultingDataFrame = dataFrameFirstTable.join(dataFrameSecondTable, 
            "DEPARTMENTID");


    //FILTERS. THEY DO NOT THROW ERROR, BUT ARE NOT APPLIED. RESULTS ARE ALWAYS THE SAME, WITHOUT FILTERS
    resultingDataFrame.where(resultingDataFrame.col("AGE").geq(25));
    resultingDataFrame.where(resultingDataFrame.col("AGE").leq(50));

    JavaRDD<Row> resultFromQuery = resultingDataFrame.toJavaRDD();

    //HERE I CONFIRM THAT THE NUMBER OF ROWS GOTTEN IS ALWAYS THE SAME, SO THE FILTERS DO NOT WORK.
    System.out.println("Number of rows "+resultFromQuery.count());

    return resultFromQuery;

}

2 个答案:

答案 0 :(得分:4)

where返回一个新的数据帧并且不会改变现有的数据帧,因此您需要存储输出:

DataFrame greaterThan25 = resultingDataFrame.where(resultingDataFrame.col("AGE").geq(25));
DataFrame lessThanGreaterThan = greaterThan25.where(resultingDataFrame.col("AGE").leq(50));
JavaRDD<Row> resultFromQuery = lessThanGreaterThan.toJavaRDD();

或者你可以把它链起来:

DataFrame resultingDataFrame = dataFrameFirstTable.join(dataFrameSecondTable, "DEPARTMENTID")
  .where(resultingDataFrame.col("AGE").geq(25))
  .where(resultingDataFrame.col("AGE").leq(50));

答案 1 :(得分:1)

people.select("person_id", "first_name").filter(people("person_id") == 2).show

它无效,您将收到以下错误:

  

错误:使用替代方法重载方法值过滤器:   (conditionExpr:String)org.apache.spark.sql.DataFrame   (条件:org.apache.spark.sql.Column)   org.apache.spark.sql.DataFrame不能应用于(布尔)

看来,要使用Spark数据框中的Select子句和过滤器,我们无法传递布尔值。

这两个查询用于从Spark DataFrame中选择具有两个不同子句的单行,where和filter。

people.select("person_id", "first_name").filter(people("person_id") === 2).show

people.select("person_id", "first_name").where(people("person_id") === 2).show

使用上述查询之一,从Spark DataFrame中选择单行。