2017-03-21 21 views
2

私はパーケットに変換したいファイルをCSVファイルに保存しています。米国以外の番号形式のCSVファイルからのスパークロード番号

sqlContext.read() 
.format("com.databricks.spark.csv") 
.schema(schema) 
.option("delimiter",";") 
.(other options...) 
.load(...) 
.write() 
.parquet(...) 

は、スキーマに文字列のみが含まれている場合に問題ありません。しかし、フィールドのいくつかは数字として保存することができます。

問題は、ファイルが実際の "csv"ではなくセミコロンで区切られたファイルとして到着し、数字がドイツ語表記でフォーマットされていることです。つまりカンマが小数点の区切り文字として使用されます。このファイルには123.01になり、米国で何たとえば

は、123,01

として格納される異なるロケールでの数字か、私はこれを変換することが可能になる他のいくつかの回避策を読んで強制する方法はあります最初にCSVファイルを別の形式に変換せずに私はSparkコードを見て、問題を引き起こしていると思われる1つの厄介なことは、CSVInferSchema.scala 268行目(spark 2.1.0)にあります。パーサは、米国の書式設定を強制します。 JVMのロケールセットに依存するか、何らかの形でこれを設定することができます。

私はUDTを使うと思っていましたが、それはどこにもありません - 私は自分自身を解析できるようにする方法を見つけることができません(UDTの良い例を見つけることはできませんでした...)

これを直接的に達成する方法、つまり解析ステップで何か提案がありましたら、中間変換を実行してから、それを単に寄せ木に変換しますか?答えを探しているかもしれない他の誰のために

+0

これは開発中です。https://issues.apache.org/jira/browse/SPARK-18359 – mtoto

+0

ありがとう、mtoto。これは私が必要とする前に準備が整っていない可能性があるので、私はマーカに押し込む前に文字列のみのスキーマ(適切に解析する)から変換を実装しました。 – Lili

答えて

0

- 私は今のところ(Javaで)と一緒に行きました回避策です:変換関数は、行を取り、変換の分野で新しい行を返す必要があり

JavaRDD<Row> convertedRDD = sqlContext.read() 
.format("com.databricks.spark.csv") 
.schema(stringOnlySchema) 
.option("delimiter",";") 
.(other options...) 
.load(...) 
.javaRDD() 
.map (this::conversionFunction); 
sqlContext.createDataFrame(convertedRDD, schemaWithNumbers).write().parquet(...); 

(実際には、これは任意の変換を実行することができます)。 Javaの行は、RowFactory.create(newFields)によって作成できます。

私はこれに近づく方法を他にも聞いてもらえますが、今のところこれが機能します。 :)