以前はさまざまなR
スクリプトのデータを取得するために使用されていた複数のSQLクエリをコード化するのにかなりの時間を費やしました。なぜデータベース自体にVIEW
Sを作成すると、この問題が解決しない - これは、手がかりがいくつかのクエリのために前のクエリからの結果が必要であること、であるScala&Spark:リサイクルSQLステートメント
sqlContent = readSQLFile("file1.sql")
sqlContent = setSQLVariables(sqlContent, variables)
results = executeSQL(sqlContent)
を働いていた方法です。 Spark 2.0
で、私はすでに
// create a dataframe using a jdbc connection to the database
val tableDf = spark.read.jdbc(...)
var tempTableName = "TEMP_TABLE" + java.util.UUID.randomUUID.toString.replace("-", "").toUpperCase
var sqlQuery = Source.fromURL(getClass.getResource("/sql/" + sqlFileName)).mkString
sqlQuery = setSQLVariables(sqlQuery, sqlVariables)
sqlQuery = sqlQuery.replace("OLD_TABLE_NAME",tempTableName)
tableDf.createOrReplaceTempView(tempTableName)
var data = spark.sql(sqlQuery)
てちょうどそれを行う方法を考え出したしかし、これは私の謙虚な意見では非常に手間のかかるです。さらに複雑なクエリ(例:サブクエリの因数分解を非同期化するクエリは現在動作しません。
は、(全体的な目標がそれぞれ1つの前のSQLクエリの結果を表す、複数のorg.apache.spark.sql.DataFrame
Sを取得することです
filter($"")
を使用してSpark.SQL
コードに再実装SQLコードのような、より堅牢な方法は、あります.select($"")
常にいくつかのJOIN
s、WITH
sなど)。したがってn
DataFrame
につながるクエリn
2つのオプションよりも優れたオプションがありますか?
セットアップ:Hadoopのv.2.7.3
、2.0.0
スパーク、インテリJのIDEA 2016.2
は、Scalaの2.11.8
は、TestclusterはWin7のワークステーション
私は完全にそれを得ていませんでした。単一のSQLファイルに複数のクエリがあり、最後に各クエリをTempViewとして登録する必要がありますか?または複数のsqlファイル、それぞれが1つのクエリを持ち、各クエリが1つのTempViewを登録していますか?私は問題の問題を見ない。 –
後者、ありがとう!私はそれを明確にするためにいくつかの情報を追加しました。 – Boern
だから、n個のsqlファイルからn個のDataFramesが必要です。あなたが追加したコードですでに解決されています。あなたのソリューションの中で "偽装"とは何か、なぜあなたは "より良い"ソリューションを必要としますか? –