2017-03-01 11 views
0

私は同様の記事を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値のリストを読み込むための方法を探しているなら

おかげ

答えて

1

は、私は、これはそれをしないと思いますArray(id, name, age)

EDIT: あなたの実際の目標にしたように、私は実際にpredicationという名前の任意のオプションを知らない(でも私ができますSpark 2.0.2を使用して、ソースの証拠を見つけます)。

JDBCデータソースは、使用されたクエリで選択された実際の列に基づいて「投影プッシュダウン」を実行します。言い換えれば - のみ選択列すぐにDFの作成以下selectcolNames配列を使用できるように、DBから読み込まれます、例えば:

import org.apache.spark.sql.functions._ 

sparkSession.read 
    .format("jdbc") 
    .options(Map("url" -> url, "dbtable" -> dbTablename, "driver" -> dbDriver)) 
    .load() 
    .select(colNames.map(col): _*) // selecting only desired columns 
+0

親愛なるTzachゾハル、これは私が探していたものexactelyですために。あなたの助けに感謝します。 – S12000

+0

しかし、私は "predication" - >列にエラーがあります、それは 'オーバーロード'メソッドと言います。何が問題なのか分かりますか?ありがとう – S12000

+0

あなたが参照しているエラーについてはわかりませんが、DBから選択された列のみを読むというあなたの実際の目標を支援するために私の回答を更新しました –

関連する問題