2016-04-16 8 views
3

私はSpark 1.6.1を使用しています。 Spark Java ProgrammではPostgresデータベースに接続し、すべてのテーブルをJDBC経由で一時テーブルとして登録します。たとえば:Apache Spark Query with HiveContextが動作しません。

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"); 

これは問題なく動作します:

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

をそして私はテーブルの内容を見ることができます:

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

また、この作品

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(); 

スパークは何もしませんが、Postgresの上の原点databseでそれは非常に良好に動作します。だから私は少しこれをこれに変更することにしました:

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

このクエリは動作しています。しかし、他のクエリは機能していません。違いはどこにありますか?なぜ最初のクエリは機能しませんが、2番目のクエリはうまく機能していますか?

データベースはあまり大きくありません。テストには、4 MBのサイズがあります。

答えて

3

異なるIDを選択しようとしているので、集計関数の一部としてタイムスタンプを選択し、IDでグループ化する必要があります。それ以外の場合は、IDとペアにするタイムスタンプはわかりません。

+0

ありがとうございました!識別名を削除すると、クエリが機能しています。しかし、あなたが説明したように私の問題を解決する方法はわかりません。これで私を助けることができますか? –

+0

IDを取得するのに興味のあるタイムスタンプを決める必要があります。たとえば、最新のものを希望する場合は、 'select id、max(timestamp)from measure、measure_range w WHERE tble.timestamp> = IDによってIDグループをグループ化します。 ' –

+0

クエリ内の文字を忘れました。動作していないクエリは次のとおりです。SELECT distinct id、timestamp FROM measure tble、measure_range w WHERE tble.timestamp> = w.leftおよびtble.timestamp <= w.right。私が次に実行するとき:SELECT id、max(timestamp)FROM measure tble、measure_range w where tble.timestamp> = w.leftおよびtble.timestamp <= w.right by group by wid。スパークも何もしていない。 Web UIでは、ジョブが実行されていると言われていますが、何も起こりません。 –

関連する問題