web-dev-qa-db-ja.com

Spark-Csv書き込みquotemodeが機能しない

Spark-CSVを使用してDataFrameをCSVファイルとして書き込もうとしています( https://github.com/databricks/spark-csv

以下のコマンドを使用しています

res1.write.option("quoteMode", "NONE").format("com.databricks.spark.csv").save("File")

しかし、私のCSVファイルは常に次のように書き込まれます

「ロンドン」
「コペンハーゲン」
「モスクワ」

の代わりに

ロンドン
コペンハーゲン
モスクワ

7
Lawan subba

はい。二重引用符( ")と円記号(\)のデフォルトのエスケープをオフにする方法は、.write()メソッド呼び出しの後に適切なパラメーターを指定して.option()メソッド呼び出しを追加する必要があります。目標option()メソッド呼び出しの目的は、csv()メソッドが「引用符」文字のインスタンスを「検索」する方法を変更することです。これを行うには、「引用符」が実際に意味するデフォルトを変更する必要があります。つまり、検索する文字を変更します。二重引用符( ")からUnicode"\u0000 "文字(基本的に Unicode NUL文字 を提供します。これは整形式のJSONドキュメント内では発生しません)。

val dataFrame =
  spark.sql("SELECT * FROM some_table_with_a_json_column")
val unitEmitCsv =
  dataframe
    .write
    .option("header", true)
    .option("delimiter", "\t")
    .option("quote", "\u0000") //magic is happening here
    .csv("/FileStore/temp.tsv")

これは、Apache Sparkと.csvファイルの発行を試みて学んだいくつかのレッスンの1つにすぎません。これに関する詳細とコンテキストについては、「 例」というタイトルのブログ投稿を参照してください。 Apache Spark ETL Pipeline Integrated a SaaS "。

14

quoteAllオプションをfalseに設定すると、テキストの二重引用符を削除できます。

dataframe.write
 .option("quoteAll", "false")
 .format("csv")

この例は、databricks libを使用せずに、Spark 2.1.0のとおりです。

4

DataFrameに単一の文字列がある場合は、テキストファイルを直接書き出すことができます。

df.coalesce(1).map({ k:Row => k(0).toString}).toJavaRDD.saveAsTextFile("File")

複数の列がある場合は、出力ファイルに書き込む前にそれらを1つの文字列として組み合わせることができます。

与えられた他の答えは、出力ファイルで不要なnullまたはスペース文字が出力される結果になる可能性があります。

2
johnleuner

この問題は、私がこれを読むまで長い間気になります: カスタム区切り文字を追加すると、最後に二重引用符が追加されますsparkデータフレームCSV出力

これは標準のCSV機能です。実際のデータに区切り文字が含まれている場合(区切り文字の衝突と呼ばれます)、フィールドは引用符で囲まれます。 df.write.option( "delimiter"、somechar)を試すことができます。ここで、somecharは、データに含まれない文字である必要があります。

複数の列を1つに連結して、データにない区切り文字を使用することができます

0
gmail office