2017-04-15 6 views
0

以下のコードを見てください。 パーティション数の値を渡すと、以下のコードでエラーが発生します。私のスパークアプリケーションで不完全に指定されたエラーを分割する

 def loadDataFromPostgress(sqlContext: SQLContext, tableName: String, 
     columnName: String, dbURL: String, userName: String, pwd: String, 
     partitions: String): DataFrame = { 
     println("the no of partitions are : "+partitions) 
     var dataDF = sqlContext.read.format("jdbc").options(
     scala.collection.Map("url" -> dbURL, 
          "dbtable" -> tableName, 
         "driver" -> "org.postgresql.Driver", 
        "user" -> userName, 
       "password" -> pwd, 
        "partitionColumn" -> columnName, 
       "numPartitions" -> "1000")).load() 
       return dataDF 
         } 

エラー:

   java.lang.RuntimeException: Partitioning incompletely specified 
       App > at scala.sys.package$.error(package.scala:27) 
       App > at org.apache.spark.sql.execution.datasources.jdbc.JdbcRelationProvider.createRelation(JdbcRelationProvider.scala:38) 
       App > at org.apache.spark.sql.execution.datasources.DataSource.resolveRelation(DataSource.scala:315) 
       App > at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:149) 
    App > at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:122) 
       App > at Test$.loadDataFromGreenPlum(script.scala:28) 
       App > at Test$.loadDataFrame(script.scala:15) 
       App > at Test$.main(script.scala:59) 
       App > at Test.main(script.scala) 
       App > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native 
        Method) 
       App > at 

答えて

3

どのように正確に使用できるかを以下のコードで確認できます。

def loadDataFromPostgress(sqlContext: SQLContext, tableName: String, 
          columnName: String, dbURL: String, userName: String, 
          pwd: String, partitions: String): DataFrame = { 
    println("the no of partitions are : " + partitions) 
    var dataDF = sqlContext.read.format("jdbc").options(
     scala.collection.Map("url" -> dbURL, 
     "dbtable" -> "(select mod(tmp.empid,10) as hash_code,tmp.* from employee as tmp) as t", 
     "driver" -> "org.postgresql.Driver", 
     "user" -> userName, 
     "password" -> pwd, 
     "partitionColumn" -> hash_code, 
     "lowerBound" -> 0, 
     "upperBound" -> 10 
    "numPartitions" -> "10" 
    )).load() 
    return dataDF 
    } 

上記のコードでは、以下のように10個のクエリを含む10個のタスクが作成されます。 そのジョブがこれはEMPIDは0で終わる10のパーティションおよび

を作成します

offset = (upperBound-lowerBound)/numPartitions

ここ

offset = (10-0)/10 = 1

select mod(tmp.empid,10) as hash_code,tmp.* from employee as tmp where hash_code between 0 between 1 
select mod(tmp.empid,10) as hash_code,tmp.* from employee as tmp where hash_code between 1 between 2 
. 
. 
select mod(tmp.empid,10) as hash_code,tmp.* from employee as tmp where hash_code between 9 between 10 

を見つけるでしょう前には必ずMOD(EMPID、10)のような1つのパーティションに行くことになります0と等しい

1で終わるempidは、mod(empid、10)と同じパーティションになります。常に1となります。

このように、すべての従業員の行は10のパーティションに分割されます。

要件に応じてpartitionColumn、upperBound、lowerBound、numPartitionsの値を変更する必要があります。

私の答えがあなたに役立つことを願っています。

0

パーティションが必要です

  • パーティション列(整数)。
  • 列の列
  • 下界
  • 列の上限

の数は最後の二つが欠落している、とあなたがエラーを取得する理由です。

関連する問題