私は同様の記事をStackoverflowで見つけました。しかし、私は私の問題を解決することができませんでしたので、これが私がこの投稿を書く理由です。spark scala typesafe設定セーフ特定の列名の値を超える反復
目的
目的は、(I SQL Serverを使用)SQLテーブルのロード中にカラム投影[投影=フィルタ列]を実行することです。
Scalaの料理によれば、これは、[アレイを使用] columsをフィルタリングする方法です:
sqlContext.read.jdbc(url,"person",Array("gender='M'"),prop)
しかし、私は、Array( "COL1"、 "COL2" を、ハードコーディングする必要はありません... )私のScalaのコードの中でこれが私がtypesafe(以下を参照)で設定ファイルを使用している理由です。
設定ファイル
dataset {
type = sql
sql{
url = "jdbc://host:port:user:name:password"
tablename = "ClientShampooBusinesLimited"
driver = "driver"
other = "i have a lot of other single string elements in the config file..."
columnList = [
{
colname = "id"
colAlias = "identifient"
}
{
colname = "name"
colAlias = "nom client"
}
{
colname = "age"
colAlias = "âge client"
}
]
}
}
さんは 'columnlistの' に焦点を当ててみましょう:SQL列の名前は 'COLNAME' にexatecly対応しています。 'colAlias'は後で使用するフィールドです。
data.scalaファイル
configFromFileが別のカスタムクラスに自分で作成されます。しかし、これは問題ではありません。 columnListの型は "ConfigList"で、この型はtypesafeから来ます。
メインファイル
def loadDataSQL(): DataFrame = {
val url = datasetConfig.dbUrl
val dbTablename = datasetConfig.DbTableName
val dbDriver = datasetConfig.DriverName
val columns = // I need help to solve this
/* EDIT 2 march 2017
This code should not be used. Have a look at the accepted answer.
*/
sparkSession.read.format("jdbc").options(
Map("url" -> url,
"dbtable" -> dbTablename,
"predicates" -> columns,
"driver" -> dbDriver))
.load()
}
だから、私のすべての問題は、適切な配列にそれらを置くために「COLNAMES」の値を抽出することです。誰かが私に「val列」の正しいオペランドを書くのを助けることができますか?これはにつながる供給ファイルで
import scala.collection.JavaConverters._
val columnList = configFromFile.getConfigList("dataset.sql.columnList")
val colNames: Array[String] = columnList.asScala.map(_.getString("colname")).toArray
: - あなたはScalaの配列にcolname
値のリストを読み込むための方法を探しているなら
おかげ
親愛なるTzachゾハル、これは私が探していたものexactelyですために。あなたの助けに感謝します。 – S12000
しかし、私は "predication" - >列にエラーがあります、それは 'オーバーロード'メソッドと言います。何が問題なのか分かりますか?ありがとう – S12000
あなたが参照しているエラーについてはわかりませんが、DBから選択された列のみを読むというあなたの実際の目標を支援するために私の回答を更新しました –