使用HiveContext的Apache Spark查询不起作用

时间:2016-04-16 14:38:30

标签: apache-spark hive hiveql

我使用Spark 1.6.1。在我的Spark Java Programm中,我连接到Postgres数据库并通过JDBC将每个表注册为临时表。例如:

Map<String, String> optionsTable = new HashMap<String, String>();
optionsTable.put("url", "jdbc:postgresql://localhost/database?user=postgres&password=passwd");
optionsTable.put("dbtable", "table");
optionsTable.put("driver", "org.postgresql.Driver");
DataFrame table = sqlContext.read().format("jdbc").options(optionsTable).load();        
table.registerTempTable("table");

这没有问题:

hiveContext.sql("select * from table").show();

这也有效:

DataFrame tmp = hiveContext.sql("select * from table where value=key");
tmp.registerTempTable("table");

然后我可以看到表格的内容:

hiveContext.sql("select * from table").show();

但现在我遇到了问题。当我执行此操作时:

hiveContext.sql("SELECT distinct id, timestamp FROM measure, measure_range w WHERE tble.timestamp >= w.left and tble.timestamp <= w.right").show();

Spark没有任何作用,但是在Postgres的原始数据库中,它的效果非常好。所以我决定稍微修改一下这个问题:

hiveContext.sql("SELECT id, timestamp FROM measure, measure_range w WHERE tble.timestamp >= w.left").show();

此查询正在运行并为我提供结果。但另一个查询不起作用。区别在哪里,为什么第一个查询不起作用,但第二个查询工作正常?

数据库不是很大。对于测试,它的大小为4 MB。

1 个答案:

答案 0 :(得分:3)

由于您尝试选择不同的ID,因此需要选择时间戳作为聚合函数的一部分,然后按ID进行分组。否则,它不知道与ID配对的时间戳。