2017-06-22 3 views
0

を引用しました次のような行を持つ別のファイルもあります。スパークCSV Readerは、私は現在、次のコードを使用してCSVデータに読んでい数値

"abc","city",123 

2番目のファイルはうまくいきますjava.lang.NumberFormatException: For input string: "123"

string, string, long 

最初の結果は、それが適切に両方の有効なフォーマットのCSVを読み込むためのCSVリーダーのために可能ですか?オプションが渡されたと仮定します。

私は自動的に列のデータ・タイプを識別しinferSchemaプロパティを使用してスパーク2.1.1

答えて

1

実際にコードを使用すると、私のためにクラッシュします。私はの代わりに文字列を使用していると思われます。です。 '"'.toString.option("quote",...)に使用すると、クラッシュが修正され、機能します。さらに、次のコードのようにエスケープ文字を定義することもできます。 (ユニットテストから)解析された数値の

spark.read 
      .option("mode", "FAILFAST") 
      .option("escape", "\"") 
      .option("delimiter", DELIMITER) 
      .option("header", HASHEADER.toString) 
      .option("quote", "\"") 
      .option("nullValue", null) 
      .option("ignoreLeadingWhiteSpace", value = true) 
      .schema(SCHEMA) 
      .csv(PATH) 

例:

ClouderaののSpark2で

、Iは、予め定義されたスキーマを用いて、DecimalTypeの両方引用と引用符で囲まれていない番号を解析するために以下を使用することができました

1.0 
11 
"15.23" 
"" 
//empty field 
"0.0000000001" 
1111111111111. 
000000000. //with leading space 

これは私のテストでもIntegerTypeで動作します。これは引用符に関係なく解析できます。

+0

残念ながら、それは私の間違いです。私は実際のコードで文字を使用していません。文字列ではなく文字列として返す私のスキーマ作成クラスからパラメータを取得しています(簡単に言うと、誤って '' '"' '' '' '' '' 'の代わりに使用しました。おそらくClouderaのSpark2バージョンとJava 2.1.1 mavenビルドの違いかもしれません。 – DeeVu

+0

@DeeVuいいえ、それはありません。2.1.1を使用するようにbuild.sbtを変更したばかりで、私のユニットテストはまだ緑です。スキーマをどのように定義しましたか? –

+0

良いキャッチ。あなたはこれがまさにスキーマの問題だったのです。私のデモセットは、100桁のカラムのうちの1つを10進数の整数にキャストしようとしていました。私は私の机の上に頭を叩いていると言うことができます。 – DeeVu

1

を使用しています。

var data= sparkSession.read 
     .option("header", hasColumnHeader) 
     .option("inferSchema", "true").csv(inputPath); 
+0

私はinferSchemaを使用できません。すべてのクライアントデータセットで正しく機能しません。指数関数的に優れた独自の推論スキーマ関数があります。 "123"と123は両方とも数字であることが検出されますが、NFEを避けるために引用符を無視するようにスパークデータセットにどのように指示できますか? – DeeVu

+0

なぜ列のデータ型を文字列として読み取った後に変更できないのですか? これを回避するには、withColumnRenamedとwithColumn apiを使用できます。 – Varadha31590

+0

私はそれを試みました。 'java.lang.RuntimeException:java.lang.Stringはスキーマbigintの有効な外部型ではありません。 ' – DeeVu

関連する問題