Apache Spark Query с HiveContext не работает


Я использую Spark 1.6.1. В моей Java-программе Spark я подключаюсь к базе данных 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 МБ.

1 3

1 ответ:

Поскольку вы пытаетесь выбрать отдельный идентификатор, вам нужно выбрать метку времени как часть агрегатной функции, а затем сгруппировать по идентификатору. В противном случае он не знает, какая метка времени должна быть сопряжена с идентификатором.