我是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;
}
答案 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中选择单行。