2017-12-07 7 views
1

だから私は現在、私は火花で火花-SQLクエリを使用して読み出し動作を並列化する必要がスパーク-SQLでPOCに取り組んでいますスパークSQL生成間違った上限と下限

JavaRDD<Row> dataset = sqlContext.read().jdbc(jdBcConnectionString, getSqlQuery(), "tran_id" 
       lowerbound, upperbound, partitions, props).toJavaRDD(); 

すべてあなたが生成されたクエリ(私の場合はMS SQL Serverです)を調べるまでうまく動作します。

は、UpperBoundクエリはひとつの境界を指定するの本質は、列の値が指定された下界との間にあるすべての行を取得することであると思うだろう

exec sp_executesql N'SELECT * FROM table_name WHERE tran_id >= 770425' 

なりながら下界クエリが

exec sp_executesql N'SELECT * FROM table_name WHERE tran_id < 770425 or post_tran_id is null' 

です上向き。しかし、これは私がスパークに新しいですしてください、一つは境界を指定の本質は、列の値があるすべての行を取得することであると思うだろう。この

答えて

1

を達成するための別の方法がある場合

ではないと思わ指定された下限と上限の間。

条件は正しくありません。いつものように、ドキュメントを読むほうが良いでしょう。

lowerBoundとupperBoundは、テーブルの行をフィルタリングするのではなく、パーティションのストライドを決定するために使用されます。そのため、表のすべての行がパーティション化されて戻されます。このオプションは読書にのみ適用されます。

しかしlowerBoundはあなたのケースでupperBoundに等しいように見えます。

私は、あなたがwhereを適用後、フィルタリングしたい場合は、この

を達成するために、そこに別の方法でスパークする新しいですしていてください:

dataset.where(col("tran_id").between(lowerBound, upperBound)) 

やテーブル引数としてサブクエリを使用します。

sqlContext.read().jdbc(
    jdBcConnectionString, 
    "(SELECT * FROM table_name WHERE tran_id BETWEEN 0 AND 42) AS t", props); 
関連する問題