2016-06-21 5 views
0

私は最近、方解石(1.8.0)を学習し、私は、ユースケースを以下している起動します。私はAggCall秒に「SUM(x)/SUM(y) as myRatio」、「MAX(z) as maxZ」または「CASE WHEN …」のような文字列のリストを変換し、それを使用する必要がSqlNode式(クエリではない)をRelNodeに変換するにはどうすればよいですか?

。私は次の操作を行う必要があるようRelBuilder後で

はそう思わ:文字列に変換 - > SQLノード - >相対ノードを私はSqlParser.parseExpressionを使用してSqlNodeに文字列を変換し、RelNodeにSqlNodeが、運を変換するPlanner.rel(sqlNode)を試してみました。またSqlToRelConverterを作成しようとしました。 JdbcSchemaだけで作成されたconfigから、バリデーター、カタログ・リーダー、およびクラスターを作成する方法を見つけることができません。

答えて

0

あなたは集計関数の呼び出しを扱っているため、これは普通の式ではありません。 RelBuilderによって使用されるAggCallは、SqlNodeでもRexNodeでもありません。

したがって、最も簡単なことは、おそらく式文字列を有効なクエリ文字列に変換することです。例えば。 「SUM(x)/SUM(y) as myRatio"」は「SELECT SUM(x)/SUM(y) as myRatio FROM (VALUES (0, 0)) AS t(x, y)」になります。これを解析してRelNodeに変換します。 PlannerTest.testParseAndConvertはこれを正確に行います。数行のコードしか使用しないので、そのメソッドからコピー・ペーストすることができます。

+0

ありがとうございます!だから、 'SUM(x)/ SUM(y)をmyRatio'から' RelNode'に変換することはできますが、もう一つの式を追加するにはどうすればいいですか?例えば、SUM(x)をXとする。私は、 'RelNode'から' SUM(x)/ SUM(y)をmyRatio'パーツとして抽出し、それをビルダーに加え、 'SUM(x)as X'に対して同じことをすることを期待しています。それが可能かどうか分かりません... –

+0

あなたは、SELECT SUM(x)/ SUM(y)をmyRatio、SUM(x)AS x、SUM(y)AS y FROM(VALUES(0、0))AS t (x、y) 'と同じ方法です。 合計を計算するためには 'Aggregate'、myRatioとして$ 0/$ 1、xとして$ 0、yとして$ 1を計算する' Project'になります。 'RelBuilder'を使用している場合、' RelBuilder.aggregate() 'を呼び出して' SUM(x) 'と' SUM(y) 'を作成し、プロジェクトに' RelBuilder.project() 'を呼び出すことができます'$ 0/$ 1はmyRatio、$ 0はx、$ 1はy'です。 –

関連する問題