2017-08-10 5 views
1

私は大きなテーブルを読んで(〜100M行)読み込もうとしています。テーブルには、PostgreSQLであり、我々は読んでいる次のようにpostgreSQLから100,000行を読み込み、寄木張りに書き込む

val connectionProperties = new Properties() 
connectionProperties.put("user", "$USER") 
connectionProperties.put("password", "$PASSWORD") 

// val connection = DriverManager.getConnection("$SERVER", "$USER", "$PASSWORD") 
//connection.isClosed() 

val jdbc_url = s"jdbc:postgresql://${"$HOST"}:${$PORT}/${"$DB"}" 
val df = spark.read.option("inferSchema", true).jdbc(jdbc_url, "$TABLE", connectionProperties) 

しかし、私たちのSQLテーブルが(形式$ 100,000.23で)moneyデータ型として2列があります。 sparkで読み込むと、doubleに変換されて例外がスローされます。

私たちはやってみました: a)列データをDoubleにキャストします。しかし、Sparkも自動的に倍増するので、これは役に立たない。価値観に問題があります。 (used b)データは既にカンマでDataFrameに保存されています。 PostgreSQLの方言を使用しようとしています(https://github.com/apache/spark/blob/master/sql/core/src/main/scala/org/apache/spark/sql/jdbc/PostgresDialect.scala

本当にありがとうございます。

+0

そのラメMoneyデータ型をよりポータブルなデータ型に変換するSELECTクエリを呼び出そうとしましたか?* Sparkがデータを受け取る前に?例えば。 '(TBLからCCとしてのA、B、キャスト(Cを10進数(16,2)として選択)x' –

+0

また、10進数()は、浮動小数点型です。そして、財務的なユースケースで地獄を遊んでください... –

答えて

1

スキーマを手動で指定し、列を文字列として読み取り、次にユーザー定義関数を定義する値を手動で解析できます。

変換する方法についての詳細を学ぶために:あなたはScalaのAPIをスパーク参照してください。この

val schema = 
    StructType(
    StructField("your-example-column1", IntegerType, true) :: 
    StructField("your-money-column", StringType, true) :: Nil) 
    spark.read.schema(schema) 

のような何かを書く必要

スキーマを手動で指定するにはあなたが必要とするデータ型へのStringTypeこれまでにquestion

+1

実稼働環境では、inferSchemaは良い習慣とはみなされません。手動でスキーマを指定する必要があります。 –

+0

擬似コードで説明したように、データがDataframeに入った後、withColumnとselectExprでデータ型を変更しようとしました。ダブルはコンマの値に対して例外を出しているので動作しませんでした。 – Pranab

+0

これは、データフレームがあなたのタイプを推論することができないので、うまくいきません。代わりに、dataframeにデータを読み込む前にschema_を指定する必要があります。 – addmeaning

関連する問題