Spark DataFrameWriter опускает конечные разделители табуляции при сохранении (Spark 1.6) - PullRequest
0 голосов
/ 17 июня 2020

Я оставляю свой вопрос ниже, поскольку он был изначально отправлен для будущих разработчиков, которые столкнутся с этой проблемой. Проблема была решена после того, как я перешел на Spark2.0 - т.е. результат был таким, как я ожидал, без каких-либо изменений в исходном коде. Похоже, некоторая разница в реализации в версии 1.6, которую я использовал вначале. вход - просто фильтрация входа). Входные данные иногда имеют нулевые значения в последних столбцах строк.

Когда я использую разделитель "," в выходных данных есть запятые. Например,

val1, val2, val3,val4,val5

val1, val2, val3,,

, но если я использую табуляцию (\ t) в качестве разделителя, вывод не будет включать конечные табуляции. Например (я пишу здесь TAB, где появляется \ t):

val1 TAB val2 TAB val3 TAB val4 TAB val5

val1 TAB val2 TAB val3  <= **here I expected two more tabs (as with the comma delimiter)**

Я также пробовал другие разделители и видел, что, когда разделитель представляет собой символ пробела (например, символ ''), конечные разделители не на выходе. Если я использую другой видимый разделитель (например, букву 'z'), он работает нормально, как и разделитель запятой, и у меня есть конечные разделители.

Я думал, что это может быть связано с параметрами ignoreLeadingWhiteSpace и ignoreTrailingWhiteSpace, но их установка оба на false при написании тоже не помогли.

Мой код выглядит так:

val df = sqlContext.read.format("com.databricks.spark.csv").option("delimiter", "\t").load(params.inputPathS3)
df_filtered = df.filter(...)
df_filtered.write.format("com.databricks.spark.csv").option("delimiter", "\t").save(outputPath)

Я тоже пробовал (как писал выше):

df_filtered.write.format("com.databricks.spark.csv").option("delimiter", "\t").option("ignoreLeadingWhiteSpace", "false").option("ignoreTrailingWhiteSpace", "false").save(outputPath)

1 Ответ

0 голосов
/ 17 июня 2020

Ниже рабочий пример (с Spark 1.6): Входной файл (с некоторыми конечными пробелами в конце):

1,2,3,,
scala> val df = sqlContext.read.option("ignoreLeadingWhiteSpace", "false").option("ignoreTrailingWhiteSpace", "false").format("com.databricks.spark.csv").option("delimiter", ",").load("path")
df: org.apache.spark.sql.DataFrame = [C0: string, C1: string, C2: string, C3: string, C4: string]

scala> df.show
+---+---+---+---+---+
| C0| C1| C2| C3| C4|
+---+---+---+---+---+
|  1|  2|  3|   |   |
+---+---+---+---+---+


scala> df.write.option("nullValue", "null").option("quoteMode", "ALL").mode("overwrite").format("com.databricks.spark.csv").option("delimiter", "\t").save("path")

scala> sqlContext.read.format("com.databricks.spark.csv").option("delimiter", "\t").load("path").show
+---+---+---+---+---+
| C0| C1| C2| C3| C4|
+---+---+---+---+---+
|  1|  2|  3|   |   |
+---+---+---+---+---+

Пожалуйста, обратитесь к: this для всех варианты при чтении, записи с библиотекой databricks csv.

...